Если у меня есть файл input.txt
, содержащий :
привет Мир !
Затем выполните команду bash echo $ (cat input.txt )
выведет это :
Привет, мир !
Почему и как я могу это исправить, чтобы выводить именно то, что в файле, как в файле?
Если вы используете
echo "$(cat input.txt)"
это будет работать правильно.
Вероятно ввод echo разделен символами новой строки, и он будет обрабатывать их как отдельные команды, поэтому результат будет без символов новой строки.
Цитата со страницы руководства 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)
может привести к потере завершающих символов новой строки, и это может быть проблемой, если целостность файла является приоритетом.
Вы можете сохранить символы новой строки, например, установив для IFS значение пустое :
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3