Почему Баш удалить \ п в $ (кот файл)?

24

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

hello
world
!

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

hello world !

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

f.ardelian
источник

Ответы:

32

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

echo "$(cat input.txt)"

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

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

ариец
источник
Ницца! Так какая разница (если таковая имеется ) между $ () и обратные кавычки? (Извините, если это слишком касательно)
Чан-Хо Су,
Они эквивалентны, за исключением того , что $ (...) легче гнездо , за исключением. В обоих случаях, если вы не процитируете результат, он будет разбит на несколько аргументов в пустом пространстве.
Джеймс Henstridge
3
Но последний символ новой строки пропущен даже в двойных кавычках. В отличие от этого, оператор backlk в Perl распространяется на весь вывод команды, включая все символы новой строки.
Кит Томпсон
6
@KeithThompson да, подстановка команд удаляет все завершающие символы новой строки из вывода. Преимущество этого состоит в том, например, в том, что он echo "$(date) something"удаляет завершающий символ новой строки из вывода даты, делая так, чтобы эхо выводило дату и «что-то» в одной строке. Если вам нужно сохранить файл или вывод команды «как есть», используйте mapfile ( help mapfile) read -rd ''или цикл чтения пока.
geirha
Спасибо всем :-) Я узнал кое - что от каждого комментария здесь!
Чан-Хо Су
2

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

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

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

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

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

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

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

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

Сергей Колодяжный
источник
2

Вы можете сохранить переводы строк, например, путем установки ИФС для пустых:

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
Sarnath Jegadeesan
источник