Ви можете перенаправити все, що хочете, 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?