Перевод строки удаляется из эха, когда названо в двойных кавычках

Я пытаюсь населить названную переменную раковины $recipient , который должен содержать стоимость, сопровождаемую новой строкой.

$ set -x # force bash to show commands as it executes them

Я начинаю, населяя $user , который является стоимостью, что я хочу сопровождаться новой строкой.

$ [email protected]
+ [email protected]

Я тогда звоню $user эха в дважды указанной замене команды. эхо заявление должно создать новую строку после $user , и двойные кавычки должны сохранить новую строку.

$ recipient="$(echo $user)"
++ echo [email protected]
+ [email protected]

Однако, когда я печатаю $recipient , я вижу, что от новой строки отказались.

$ echo "'recipient'"
+ echo ''\''recipient'\'''
'recipient'

Я нашел то же самое поведение под версиями 4.1.5 и 3.1.17 удара, и также копировал проблему под чертой.

Я пытался использовать "printf", а не эхо; это ничего не изменило.

Это - ожидаемое поведение?

0
nl ja de

2 ответы

Замена команды удаляет перемещение новых строк. От стандарт:

Раковина должна расширить замену команды, выполнив команду в подсреде оболочки (см. Среду выполнения Shell), и замена замены команды (текст команды плюс приложение "$ ()" или одинарные левые кавычки) со стандартным выводом команды, удаляя последовательности одного или нескольких знаков в конце замены. Вложенные знаки перед концом продукции не должны быть удалены; однако, их можно рассматривать как разделители полей и устранить во время области, разделяющейся, в зависимости от ценности IFS и указывающей, который является в действительности. Если продукция содержит какие-либо пустые байты, поведение неуказанное.

Необходимо будет явно добавить новую строку. Возможно:

recipient="$user
"

Нет действительно никакой причины использовать замену команды здесь. (Который должен сказать, что $ (эхо...) является почти всегда глупой вещью сделать.)

4
добавлено
ANSI указывающие работы также: recipient= $ ' $user\n'
добавлено автор glenn jackman, источник

Все версии раковины будут реагировать тот же самый путь, это не ничто нового в сценариях.

Новая строка в конце вашего оригинального назначения не включена в стоимость переменной. Это только "заканчивает" ток cmd и сигнализирует, чтобы раковина обработала.

Возможно, пользователь = "[email protected]\n" будет работать, но без контекста о том, почему вы хотите это, просто знайте, что люди обычно разделяют ценности переменных от форматирования "инструменты" как новая строка.

IHTH.

1
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.