Подтвердить что ты не робот

Эхо-выходы -e в сценариях bash. Как я могу это предотвратить?

Я прочитал страницы man на эхо, и он говорит мне, что параметр -e позволит экранированному символу, например экранированному n для новой строки, иметь особое значение. Когда я набираю команду

$ echo -e 'foo\nbar'

в интерактивную оболочку bash, я получаю ожидаемый результат:

foo
bar

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

-e foo
 bar

Как будто echo интерпретирует -e как параметр (потому что новая строка все еще отображается), но также интерпретирует -e как строку для эха. Что здесь происходит? Как я могу предотвратить появление -e?

4b9b3361

Ответ 1

Вам нужно использовать #!/bin/bash как первую строку в script. Если вы этого не сделаете или используете #!/bin/sh, script будет запущен оболочкой Bourne, а его echo не распознает параметр -e. В целом рекомендуется, чтобы все новые скрипты использовали printf вместо echo, если важна переносимость.

В Ubuntu sh предоставляется символическая ссылка на /bin/dash.

Ответ 2

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

То, что вы, вероятно, видите здесь, - это разница между версией echo, встроенной в bash vs /bin/echo, или, возможно, против какой-либо другой встроенной оболочки. Это немного меня, когда Mac OS X v10.5 поставляется с bash встроенным echo, который повторял флаги, в отличие от ожидаемых моих сценариев...

В любом случае, есть решение: вместо этого используйте printf. Он всегда интерпретирует escape-последовательности в своем первом аргументе (строка формата). Проблемы состоят в том, что он автоматически не добавляет новую строку (поэтому вы должны помнить это явно), а также интерпретирует последовательности % в своем первом аргументе (это, в конце концов, строка формата). Как правило, вы хотите поместить все форматирование в строку формата, а затем поместить переменные строки в остальные аргументы, чтобы вы могли контролировать, как они интерпретируются с помощью формата %, который вы используете для интерполяции в вывод. Некоторые примеры:

printf "foo\nbar\n"      # this does what you're trying to do in the example
printf "%s\n" "$var"     # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var"     # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example

Ответ 3

Использование

alias echo/usr/bin/echo

чтобы заставить "эхо" вызывать эхо ядра Coreutils, которое интерпретирует параметр "-e".