эхо символа новой строки не работает в Баш

13

У меня есть Баш скрипт , который имеет множество echoзаявлений , а также я псевдоним , echoчтобы echo -eкак в .bash_profileи .bashrc, таким образом , что новые линии печатаются правильно для заявления , как echo 'Hello\nWorld'результат должен быть

Hello
World

но вывод я получаю

Hello\nWorld

Я даже пытался использовать shopt -s expand_aliasesв сценарии, это не помогает

Я запускаю свой скрипт как bash /scripts/scriptnm.sh; если я запускаю его, когда . /scripts/scriptnm.shполучаю желаемый результат ...

Bashuser
источник
3
алиасинг echoкак хочешь это плохая практика ИМХО
shellholic
1
Используйте двойные кавычки, чтобы интерпретировать \ n. Одиночные кавычки мешают интерпретации \ n и кучу других вещей.
BillThor

Ответы:

16

Смешанная история echoозначает, что его работа по умолчанию варьируется от оболочки к оболочке. POSIX указывает, что результат echo«определяется реализацией», если первый аргумент равен -nили любой аргумент содержит обратную косую черту.

Более надежно использовать printf(в качестве встроенной команды или внешней команды), где поведение более четко определено: обратная косая черта в стиле C и спецификаторы формата поддерживаются в строке формата (первый аргумент).

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

Вы можете контролировать расширение обратной косой черты управляющих последовательностей из баш «ы echoвстроенной команды с xpg_echoопцией оболочки.

Установите его в верхней части любого скрипта bash, чтобы echoавтоматически расширять экранирование обратной косой черты без необходимости добавления -eк каждой команде echo.

shopt -s xpg_echo
echo 'foo\nbar'
Крис Джонсен
источник
shopt -s xpg_echo; Работал на меня.
Bashuser
6

При использовании bash myfile.shBash запускается в «пакетном» режиме в отдельном процессе и не читает свой профиль или файл rcfile.

Когда вы используете . myfile.shфайл, он получен текущим процессом оболочки (как если бы его содержимое было набрано вами), поэтому он видит ваши псевдонимы, определенные в данный момент.

В целом, это очень плохая идея - писать сценарии, которые зависят от конкретной конфигурации оболочки, особенно от псевдонимов, если вы не определите их в самом сценарии . ( Никогда не полагайтесь на пользователя .bashrc, даже если он ваш.)

user1686
источник
5

Рекомендуемая практика - использовать printfдля всех новых скриптов.

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"
Приостановлено до дальнейшего уведомления.
источник
+1 printf немного сложнее в использовании, чем echo, но он более чем оправдывает себя, избегая несоответствий в echo.
Гордон Дэвиссон
1

Это отлично работает в терминале

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

сохранить в файл и сделать его исполняемым (chmod + x)

запустить как ./your_file

Lalex
источник
запустите его как bash your_file и проверьте вывод.
Bashuser
Работает как положено
LaLeX
но echo "Hello \ nWorld" не показывает ожидаемый результат. Поскольку эхо уже имеет псевдоним для эха, то должно, но это не работает, и это мой вопрос
Bashuser
Поскольку псевдоним echo плохой практикой (программы, которые зависят от него, могут сломаться), вы должны удалить псевдоним и в своем скрипте
выполнить
Большое спасибо LaLex за ваши ответы, есть ли способ, которым я могу достичь ожидаемого результата с псевдонимом, хотя это не очень хорошая практика
Bashuser