Ви можете перенаправити все, що хочете, echo
але з цим нічого не вийде. echo
не читає його стандартний ввід. Все, що він робить, - це записати на стандартний висновок свої аргументи, розділені символом пробілу та завершені символом нової лінії (а також з деякими echo
реалізаціями з деякими послідовностями втечі в них розширені та / або аргументи, що починаються з -
можливого трактування як варіанти).
Якщо ви хочете 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
, що все ще формує додатковий процес. Також зауважте, що одна відмінність полягає в тому, що ви не помилитесь, якщо спробуєте прочитати файл типу каталогу таким чином. Також, хоч $(< file)
це особливе значення, $(< file; other command)
це не (в zsh
, коли не емуляція іншої оболонки, яка все-таки розширила б вміст file
, запустивши неявну $READNULLCMD
команду (як правило, пейджер)).
echo
?