11

У меня есть скрипт bash, в котором есть много операторов 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 Я получаю желаемый результат ...

4 ответа4

14

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

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

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

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

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

shopt -s xpg_echo
echo 'foo\nbar'
5

Когда вы используете bash myfile.sh , Bash запускается в "пакетном" режиме в отдельном процессе и не читает его профиль или файл rcfile.

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

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

5

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

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

printf '%s\n' "Hello\nWorld"
1

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .