Строка трубы с новой строкой для команды в bash?
Я пытаюсь передать строку с новой строкой в PHP script через BASH.
#!/bin/bash
REPOS="$1"
REV="$2"
message=$(svnlook log $REPOS -r $REV)
changed=$(svnlook changed $REPOS -r $REV)
/usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php <<< "${message}\n${changed}"
Когда я это делаю, я вижу буквальный "\n", а не экранированную строку новой строки:
blah blah issue 0000002.\nU app/controllers/application_controller.rb
Любые идеи о том, как перевести '\n' на литерал новой строки?
Кстати: что означает < < < сделать в bash? Я знаю, переходит в файл...
Ответы
Ответ 1
попробовать
echo -e "${message}\n${changed}" | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php
где -e позволяет интерпретировать обратные слэши (согласно man echo
)
Обратите внимание, что это также интерпретирует escape-обраты, которые вы потенциально имеете в ${message}
и ${changed}
.
Из руководства bash: Здесь Строки
Вариант здесь документов, формат:
<<<word
Слово расширяется и передается команде на его стандартный ввод.
Итак, я бы сказал
the_cmd <<< word
эквивалентно
echo word | the_cmd
Ответ 2
newline=$'\n'
... <<< "${message}${newline}${changed}"
<<<
называется "здесь строка". Это однострочная версия "here doc", которая не требует разделителя, такого как "EOF". Это версия документа:
... <<EOF
${message}${newline}${changed}
EOF
Ответ 3
чтобы избежать интерпретации потенциальных escape-последовательностей в ${message}
и ${changed}
, попробуйте объединить строки в подоболочке (новая строка добавляется после каждого echo
, если вы не укажете опцию -n
):
( echo "${message}" ; echo "${changed}" ) | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php
В скобках выполняются команды в подоболочке (если скобок не указана, только выход второго эха будет передан в вашу php-программу).