Разные реализации echo
ведут себя по-разному. Некоторые не принимают параметры (то есть просто выводят -e
, как вы описали) и автоматически интерпретируют escape-последовательности в своих параметрах. Некоторые принимают флаги и не интерпретируют escape-символы, если не указан флаг -e
. Некоторые принимают флаги и интерпретируют различные escape-последовательности в зависимости от того, был ли передан флаг -e
. Некоторые заставят вас рвать на себе волосы, если вы попытаетесь заставить их вести себя предсказуемо ... о, подождите, вот и все.
То, что вы, вероятно, видите здесь, - это разница между версией echo
, встроенной в bash
против /bin/echo
или, возможно, по сравнению со встроенной оболочкой какой-либо другой оболочки. Это меня поразило, когда Mac OS X v10.5 поставлялась со встроенной в echo
bash, которая отражала флаги, в отличие от того, что ожидали все мои скрипты ...
В любом случае, есть решение: используйте 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