Если у меня есть файл input.txt
, содержащий:
hello
world
!
Тогда выполнение команды bash echo $(cat input.txt)
выведет:
hello world !
Почему и как это исправить вывести именно то, что в файле, как это в файле?
Если вы используете
echo "$(cat input.txt)"
, он будет работать правильно.
Вероятно, ввод echo разделен символами новой строки, и он будет обрабатывать его как отдельные команды, поэтому результат будет без символов новой строки.
Цитируется со страницы руководства bash, раздел Command Substitution
:
Встроенные символы новой строки не удаляются, но могут быть удалены во время разделения слов.
blockquote>Чуть дальше, тот же раздел:
Если подстановка встречается в двойных кавычках, разбиение слов и раскрытие имени пути не выполняются.
blockquote>Вот почему
echo "$(cat /etc/passwd)"
работает.Кроме того, следует помнить, что подстановка команд спецификациями POSIX удаляет завершающие символы новой строки:
$ echo "$(printf "one\ntwo\n\n\n")" one two
Таким образом, вывод файла через
$(cat file.txt)
может привести к потере завершающего символа переводы строки, и это может быть проблемой, если целостность файла является приоритетом.
Можно сохранить новые строки, например, установкой IFS для освобождения:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3