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


24

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

hello
world
!

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

hello world !

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

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.