У меня есть файл с именем my_file.txt
, содержимое которого является просто строкой Hello
. Как я мог перенаправить его содержимое в команду echo
?
Я знаю , что есть команды less
, cat
, more
... но мне нужно сделать это с echo
.
Я попробовал это:
$ cat my_file.txt | echo
а также это:
$ echo < my_file.txt
Но в обоих случаях в stdout отображается только пробел, а не содержимое my_file.txt.
Как я мог это сделать?
shell
io-redirection
echo
danielmbcn
источник
источник
echo
?\n
,b
...) в файле, что будет допустимым использованиемecho
(по крайней мере, стандартнымecho
). Или, по-видимому, он хочет понять, почему это не работает таким образом. В любом случае, нет причин понижать рейтинг ИМО.Ответы:
Вы можете перенаправить все, что хотите,
echo
но с этим ничего не поделаешь.echo
не читает свой стандартный ввод. Все, что он делает, это записывает в стандартный вывод свои аргументы, разделенные символом пробела и оканчивающиеся символом новой строки (и с некоторымиecho
реализациями с некоторыми escape-последовательностями в них, расширенными и / или аргументами, начинающимися с,-
возможно, обработанными как опции).Если вы хотите
echo
отобразить содержимое файла, вы должны передать это содержимое в качестве аргументаecho
. Что-то типа:Обратите внимание , что
$(...)
полосы тянущейся символ новой строки с с выхода этойcat
команды, иecho
добавляет одну задние.Также обратите внимание, что кроме как
zsh
, вы не можете передавать NUL-символы в аргументах команды, так что описанное выше обычно не работает с двоичными файлами.yash
также удалит байты, которые не являются частью допустимых символов.Если причина для желания сделать это потому , что вы хотите ,
echo
чтобы расширить\n
,\b
,\0351
... экранирующие последовательности в файле (в UNIX совместимыеecho
реализации делают, но не все ), то вы бы лучше использоватьprintf
вместо :В отличие от
echo
этого, он является переносимым и не будет иметь проблем, если содержимое файла начинается с-
.В качестве альтернативы
$(cat file)
, сksh
,zsh
иbash
, можно также сделать:$(<file)
. Это специальный оператор, в котором оболочка вместоcat
содержимого читает файл для расширения. Он по-прежнему удаляет завершающие символы новой строки и заглушает байты NUL, кроме как вzsh
. В томbash
, что все еще разветвляется дополнительный процесс. Также обратите внимание, что одно отличие состоит в том, что вы не получите никакой ошибки, если попытаетесь прочитать файл типа directory таким образом. Кроме того, хотя он$(< file)
является особенным,$(< file; other command)
это не так (zsh
если не эмулировать другую оболочку, это все равно расширило бы содержимоеfile
, выполнив неявную$READNULLCMD
команду (обычно это пейджер)).источник
cat
и просто оболочка читать непосредственно:echo "$(<my_file.txt)"
.$(<filename)
.Добавляя к другим ответам, вы также можете попробовать перенаправление ввода вместо
cat
или
$()
и `` выполняют то же самое, они запускают команды внутри своей области видимости и передают вывод в оболочку, как если бы он был задан как ввод пользователем. Единственное различие между ними состоит в том, что $ () может быть рекурсивным и `` не может быть рекурсивным.источник
Простой ответ: вы не можете.
echo
(будь то встроенная оболочка или обычный двоичный файл) не обрабатывает свой стандартный ввод - это только один способ.источник
Как было сказано,
Например, вы можете сделать это следующим образом
xargs
(учитывая, что вам нужно включить интерпретацию обратной косой черты ):Или просто то, что вы спросили (без интерпретации последовательностей Escape ):
источник
xargs echo
(то же самое, что иxargs
btw какecho
команда по умолчанию)echo
будет выполняться команда из файловой системы, а не встроеннаяecho
команда оболочки . Также обратите внимание, чтоxargs
ожидается его ввод в очень специфическом формате (где пробелы, новые строки, кавычки, обратные слеши имеют особое значение).cat
здесь не имеет особого смысла, так как есть только один файл для объединения (так же, как< file.txt xargs echo
. Обратите внимание, что Unix-совместимыеecho
s по умолчанию выполняют экранирование с обратной косой чертой и выводят их-e
при этомecho -e
.В bash также должно работать следующее:
Часть в обратных галочках заменяется выводом этой команды, т.е. в этом случае заменяется содержимым файла.
источник
$( . . . )
. Люди, которые используют,$()
обычно предпочитают их, потому что вы можете их вкладывать. Этот вопрос старый, но гораздо приятнее отвечать на вопросы, на которые еще нет ответа!my_file.txt
содержит*
, это напечатало бы список имен файлов в текущем каталоге.