Если у меня есть файл , 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 разделен символами новой строки, и он будет обрабатывать его как отдельные команды, поэтому результат будет без символов новой строки.
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=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3