Якщо у мене є файл, input.txt
що містить:
hello
world
!
Тоді виконання команди bash echo $(cat input.txt)
виведе це:
hello world !
Чому і як я можу це виправити, щоб вивести саме те, що є у файлі, як це у файлі?
Якщо у мене є файл, input.txt
що містить:
hello
world
!
Тоді виконання команди bash echo $(cat input.txt)
виведе це:
hello world !
Чому і як я можу це виправити, щоб вивести саме те, що є у файлі, як це у файлі?
Відповіді:
Якщо ви використовуєте
echo "$(cat input.txt)"
він буде працювати правильно.
Ймовірно, вхід ехо розділений новими рядками, і він буде обробляти його як окремі команди, тому результат буде без нових рядків.
echo "$(date) something"
вилучення останнього рядка з виводу дати, що робить відлуння дати та "щось" на тій же лінії. Якщо вам потрібно зберегти файл або вихід команди "як є", використовуйте mapfile ( help mapfile
) read -rd ''
або певний цикл читання.
Цитується на сторінці керівництва bash, розділ Command Substitution
:
Вбудовані нові рядки не видаляються, але вони можуть бути видалені під час розбиття слів.
Трохи далі, той самий розділ:
Якщо підміна з'являється в подвійних лапках, розбиття слів і розширення імені шляху не виконуються за результатами.
Ось чому echo "$(cat /etc/passwd)"
працює.
Крім того, слід пам’ятати, що підміна команд специфікаціями POSIX видаляє зворотні нові рядки:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
Таким чином, виведення файлу через $(cat file.txt)
може призвести до втрати зворотних нових рядків, і це може бути проблемою, якщо цілісність файлу є пріоритетною.
Ви можете зберегти нові рядки, наприклад, встановивши IFS порожнім:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3