Чому bash видаляє \ n в $ (файл cat)?


24

Якщо у мене є файл, input.txtщо містить:

hello
world
!

Тоді виконання команди bash echo $(cat input.txt)виведе це:

hello world !

Чому і як я можу це виправити, щоб вивести саме те, що є у файлі, як це у файлі?

Відповіді:


32

Якщо ви використовуєте

echo "$(cat input.txt)"

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

Ймовірно, вхід ехо розділений новими рядками, і він буде обробляти його як окремі команди, тому результат буде без нових рядків.


Приємно! Тож яка різниця (якщо така є) між $ () і зворотними посиланнями? (Вибачте, якщо це занадто дотично)
Chan-Ho Suh

Вони еквівалентні, за винятком того, що $ (...) легше гніздо. В обох випадках, якщо ви не цитуєте результат, він буде позначений декількома аргументами про пробіл.
James Henstridge

3
Але остаточний символ нового рядка опущений навіть у подвійних лапках. На відміну від цього, оператор backtick 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)може призвести до втрати зворотних нових рядків, і це може бути проблемою, якщо цілісність файлу є пріоритетною.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.