Да, echo $foo
вызовет неожиданные побочные эффекты.
Проблемы с расширением пути
Рассмотрим каталог с этими четырьмя файлами:
$ ls
f* factor fo? foo
Теперь,обратите внимание, что echo $foo
создает список из восьми имен файлов:
$ foo=$(ls -1)
$ echo $foo
f* factor fo? foo factor fo? foo foo
Это происходит потому, что не заключенный в кавычки $foo
в echo $foo
подвергается не только разбиению слов (чточто исключает символы новой строки), но также и расширение имени пути .
Если мы используем замену шаблона внутри двойных кавычек, однако мы получаем правильный список файлов:
$ echo "${foo//$'\n'/ }"
f* factor fo? foo
Проблемы с эхом bash
Как указывало @ lurker , echo
может действовать удивительным образом.
Рассмотрим каталог с тремя файлами:
$ ls
-e \none \text
Теперь попробуйте:
$ foo=$(ls -1)
$ echo $foo
one ext
Как видите, имена файлов были искажены.Это связано с тем, что echo
интерпретировал имя файла -e
не как имя файла, а как опцию, которая включает интерпретацию escape-последовательностей.Таким образом, имя файла, чьи символы имеют обратную косую черту, становится символом новой строки.и имя файла, чьи символы представляют собой текст с обратной косой чертой, становится tab-ext.
Команда эха Bash не совместима с POSIX echo
, для которого -e
рассматривается как текст для печати,Таким образом, код, основанный на echo
, не является переносимым.По этой причине, среди прочего, часто рекомендуется , чтобы новый код использовал printf
вместо echo
.