Почему bash удаляет \ n в $ (файл cat)?

Если у меня есть файл input.txt, содержащий:

hello
world
!

Тогда выполнение команды bash echo $(cat input.txt) выведет:

hello world !

Почему и как это исправить вывести именно то, что в файле, как это в файле?

24
задан 26 June 2018 в 09:58

3 ответа

Если вы используете

echo "$(cat input.txt)"

, он будет работать правильно.

Вероятно, ввод echo разделен символами новой строки, и он будет обрабатывать его как отдельные команды, поэтому результат будет без символов новой строки.

0
ответ дан 26 June 2018 в 09:58

Цитируется со страницы руководства bash, раздел Command Substitution:

Встроенные символы новой строки не удаляются, но могут быть удалены во время разделения слов.

Чуть дальше, тот же раздел:

Если подстановка встречается в двойных кавычках, разбиение слов и раскрытие имени пути не выполняются.

Вот почему echo "$(cat /etc/passwd)" работает.

Кроме того, следует помнить, что подстановка команд спецификациями POSIX удаляет завершающие символы новой строки:

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

Таким образом, вывод файла через $(cat file.txt) может привести к потере завершающего символа переводы строки, и это может быть проблемой, если целостность файла является приоритетом.

0
ответ дан 26 June 2018 в 09:58

Можно сохранить новые строки, например, установкой IFS для освобождения:

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
1
ответ дан 14 September 2019 в 08:34

Другие вопросы по тегам:

Похожие вопросы: