Перенаправление содержания файла к команде “эхо”

если Вы используете zsh:

  • Вы не должны вводить cd, просто введите путь к каталогу (/foo/bar/baz равняется cd /foo/bar/baz)

    требует auto_cd опция, которая будет установлена

  • можно развернуть сокращенные пути с Tab ключ (/u/sh/pi расширяется до /usr/share/pixmaps; работы для имен файлов также)

43
08.11.2019, 20:48
5 ответов

Можно перенаправить все, что Вы хотите echo но это ничего не сделает с ним. echo не читает его стандарт ввел. Все, что это делает, записать в стандартный вывод его аргументы, разделенные пробелом и завершенные символом новой строки (и с некоторыми echo реализации с некоторыми escape-последовательностями в них расширенный и/или аргументы, запускающиеся с - возможно рассматриваемый как опции).

Если Вы хотите echo для отображения содержания файла необходимо передать то содержание как аргумент echo. Что-то как:

echo "$(cat my_file.txt)"

Отметьте это $(...) разделяет запаздывающие символы новой строки от вывода этого cat команда, и echo добавляет тот назад.

Также отметьте это кроме с zsh, Вы не можете передать символы NUL в аргументах команды, так, чтобы выше обычно не работал с двоичными файлами. yash также удалит байты, которые не являются частью допустимых символов.

Если причина желания сделать, который является, потому что Вы хотите echo расшириться \n, \b, \0351... escape-последовательности в файле (как совместимый 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 команда (обычно пейджер)).

55
27.01.2020, 19:34
  • 1
    И в ударе и в zsh можно пропустить cat и просто считайте оболочку это в непосредственно: echo "$(<my_file.txt)". –  Kevin 04.02.2013, 16:52
  • 2
    Да, с ksh zsh и ударом можно использовать $(<filename). огромное спасибо –  Dimitre Radoulov 04.02.2013, 17:25
  • 3
    , это - то, в чем я нуждался, и оно работало! :-) –  danielmbcn 04.02.2013, 17:36
  • 4
    @Kevin, Dimitre, добавленный теперь. –  Stéphane Chazelas 08.05.2017, 10:58

Простой ответ: Вы не можете. echo (будьте этим, окружают встроенный или регулярный двоичный файл), не обрабатывает его стандартный вход - это - один путь только.

2
27.01.2020, 19:34
  • 1
    , почему Вы на самом деле хотели бы сделать это? –  peterph 04.02.2013, 21:14

Как было сказано,

Если вы хотите, чтобы echo отображал содержимое файла, вы должны передать это содержимое в качестве аргумента в echo

Например, вы можно сделать это с помощью xargs (учитывая, что вам нужно включить интерпретацию экранирований обратной косой черты ):

$ cat my_file.txt | xargs echo -e

Или просто то, что вы просили (без интерпретации escape-последовательностей последовательностей ):

$ cat my_file.txt | xargs echo
2
27.01.2020, 19:34

В bash также должно работать следующее:

echo `cat my_file.txt`

Часть обратных кавычек заменяется выводом этой команды, т.е. в данном случае заменяется содержимое файла.

0
27.01.2020, 19:34

Добавляя к другим ответам, вы также можете попробовать перенаправление ввода вместо cat

echo $(<my_file.txt)

или

echo `<my_file.txt`

$() и `` выполнить то же самое, они запускаются команды внутри их области действия и передают вывод в оболочку, как если бы он был введен пользователем. Единственная разница между ними состоит в том, что $() может быть рекурсивным, а `` не может быть рекурсивным.

11
27.01.2020, 19:34

Теги

Похожие вопросы