Вы можете перенаправить все, что хотите, echoно с этим ничего не поделаешь. echoне читает свой стандартный ввод. Все, что он делает, это записывает в стандартный вывод свои аргументы, разделенные символом пробела и оканчивающиеся символом новой строки (и с некоторыми echoреализациями с некоторыми escape-последовательностями в них, расширенными и / или аргументами, начинающимися с, -возможно, обработанными как опции).
Если вы хотите echoотобразить содержимое файла, вы должны передать это содержимое в качестве аргумента echo. Что-то типа:
echo "$(cat my_file.txt)"
Обратите внимание , что $(...)полосы тянущейся символ новой строки с с выхода этой catкоманды, и echoдобавляет одну задние.
Также обратите внимание, что кроме как zsh, вы не можете передавать NUL-символы в аргументах команды, так что описанное выше обычно не работает с двоичными файлами. yashтакже удалит байты, которые не являются частью допустимых символов.
Если причина для желания сделать это потому , что вы хотите , echoчтобы расширить \n, \b, \0351... экранирующие последовательности в файле (в UNIX совместимые echoреализации делают, но не все ), то вы бы лучше использовать printfвместо :
printf '%b\n' "$(cat my_file.txt)"
В отличие от echoэтого, он является переносимым и не будет иметь проблем, если содержимое файла начинается с -.
В качестве альтернативы $(cat file), с ksh, zshи bash, можно также сделать:$(<file) . Это специальный оператор, в котором оболочка вместо catсодержимого читает файл для расширения. Он по-прежнему удаляет завершающие символы новой строки и заглушает байты NUL, кроме как в zsh. В том bash, что все еще разветвляется дополнительный процесс. Также обратите внимание, что одно отличие состоит в том, что вы не получите никакой ошибки, если попытаетесь прочитать файл типа directory таким образом. Кроме того, хотя он $(< file)является особенным, $(< file; other command)это не так ( zshесли не эмулировать другую оболочку, это все равно расширило бы содержимое file, выполнив неявную $READNULLCMD команду (обычно это пейджер)).
echo?