Строка трубы с новой строкой для команды в 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-программу).