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

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

привет Мир ! 

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

Привет, мир ! 

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

24
06.25.2018, 23:58
2 ответа

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

echo "$(cat input.txt)"

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

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

44
11.23.2019, 00:20
  • 1
    Хороший! Так какая разница (если вообще )между $()и обратные кавычки? (Извините, если это слишком поверхностно ) –  Chan-Ho Suh 04.14.2012, 01:49
  • 2
    Они эквивалентны, за исключением того факта, что $(...)проще вложить друг в друга. В обоих случаях, если вы не процитируете результат, он будет разделен на несколько аргументов в пробеле. –  James Henstridge 04.14.2012, 01:56
  • 3
    Но последний *символ новой строки *опущен даже в двойных кавычках. Напротив, оператор обратной кавычки в Perl расширяется до всего вывода команды, включая все символы новой строки. –  Community 04.14.2012, 07:22
  • 4
    @KeithThompson да, подстановка команд удаляет все завершающие символы новой строки из вывода. Это имеет преимущество, например. `echo "$ (date )something" `удаление завершающей новой строки из вывода даты, заставляя это echo выводить дату и "что-то" в одной строке. Если вам нужно сохранить файл или вывод команды "как есть", используйте mapfile (`help mapfile `), `read -rd '' `или цикл while read -. –  geirha 04.14.2012, 07:26
  • 5
    Спасибо всем :-)Я узнал что-то новое из каждого комментария здесь! –  Chan-Ho Suh 04.16.2012, 06:13

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

Embedded newlines are not deleted, but they may be removed during word splitting.

Чуть дальше тот же участок :

If the substitution appears within double quotes, word splitting and pathname expansion are not performed on the results.

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

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

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

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

5
11.23.2019, 00:20

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

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
5
11.23.2019, 00:20

Теги

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