Я пытаюсь передать в строке, содержащей новую строку к Сценарию PHP через 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' в литеральную новую строку?
Между прочим: что делает <<<, делают в ударе? Я знаю <передачи в файле...
try
echo -e "${message}\n${changed}" | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php
где -e разрешает интерпретацию escape-символов обратной косой черты (согласно man echo
)
Обратите внимание, что это также будет интерпретировать escape-символы обратной косой черты, которые могут быть у вас в $ {message}
и в $ {изменено}
.
Из руководства bash: Здесь Strings
Вариант здесь документов, формат следующий:
<<<word
Слово раскрывается и передается команде на ее стандартный ввод.
Я бы сказал, что
the_cmd <<< word
эквивалентно
echo word | the_cmd
Чтобы избежать интерпретации потенциальных escape-последовательностей в $ {message}
и $ {changed}
, попробуйте объединить строки в подоболочке ( новая строка добавляется после каждого echo
, если вы не указали параметр -n
):
( echo "${message}" ; echo "${changed}" ) | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php
Скобки выполняют команды в подоболочке (если скобки не указаны, только вывод второе эхо будет передано в вашу программу php).
newline=$'\n'
... <<< "${message}${newline}${changed}"
Код <<<
называется "here string". Это однострочная версия "here doc", которая не требует разделителя, такого как "EOF". Это версия here document:
... <<EOF
${message}${newline}${changed}
EOF