Когда я должен использовать <или <() или <<и> или> ()?

Я знаю это <, <(), << все используются для предоставления входа и >, >() которые используются для перенаправления вывода.

Но я не знаю то, что является четким различием между ними и когда использовать их. Объясните подробно и наряду со ссылками, если это возможно.Спасибо

4
задан 7 February 2017 в 09:54

2 ответа

"Когда использовать" действительно зависит от того, что вы делаете. Это все равно, что спрашивать, когда использовать крестовину или отвертку. Я могу сказать вам, что они все есть, и что они делают, но разработка того, когда вы будете использовать каждую из них, зависит от вас.

Все это подробно описано в TLDP Advanced Bash Scripting Guide . Если вам нужны примеры, то это то самое место.

  • <имя файла читает из файла в STDIN
  • > имя файла записывает STDOUT в файл, перезаписывая что угодно.
  • >> имя файла записывает STDOUT в файл, добавляя, если он уже есть.
  • <(команда) поглощает вывод внутренней команды и предоставляет имя файла
  • >(команда) предоставляет имя файла внешней команде, но на самом деле перенаправляет все, что в ней написано, на STDIN внутренней команды .
  • < является здесь документом, он же heredoc. Он будет читать все, что следует за STDIN, пока не увидит TOKEN снова. Это полезно для многострочного контента. За ним должна следовать новая строка. Если вы не процитируете токен, heredocs поддерживает подстановку переменных.
  • <<-TOKEN, как описано выше, за исключением того, что он будет игнорировать ведущие табуляции (но только табуляции). Это удобно для сохранения исходного форматирования, но на самом деле работает только с табуляциями. Это бесполезно на сайтах Stack Exchange, потому что они заменяют табуляции на пробелы :(
  • <<"TOKEN"] является heredoc, который не будет заменять $variables.
  • <<<"string" - это строка. Она читается в STDIN. Это может делать подстановку переменных.
  • | команда присоединяет текущий STDOUT к STDIN команде команда
  • |& команда присоединяется STDOUT и STDERR к STDINу команды команды (полезно для вывода ошибки grepping)
  • 1> и 2> используются для явного перенаправления STDOUT и STDERR. > подразумевает 1>, поэтому редко можно увидеть, что он используется явно.
  • Аналогичным образом >&1 и >&2 можно использовать для перенаправления в STDOUT и STDIN.
  • /dev/std{in,out,err} также существуют в виде сим-ссылок на основные дескрипторы файлов in/out/error. Это очень удобно, когда что-то принимает только аргумент имени файла, но вы хотите записать его в STDOUT, например.
12
ответ дан 23 November 2019 в 11:39

Ответ Оли уже дает большое количество объяснений. Моя цель в этом ответе - привести несколько практических примеров.


Входное перенаправление с помощью [команды] < file

<< перенаправление служит для отправки вывода из файла в команду. Если вы можете себе представить, то виртуальный провод отключается от клавиатуры и подключается к файлу. Оно хорошо работает, когда вы не хотите использовать трубы или не можете использовать трубы.

Например, предположим, у меня есть список файлов. Я хочу запустить какой-нибудь тест по имени каждого файла (может быть, проверить, существует ли файл, или это конкретный файл).

 while read FILENAME; do [ -d $FILENAME  ] && echo $FILENAME;done < fileList.txt

Обычно такая команда как read принимает данные из STDIN, но с помощью оператора < мы заставляем его принять данные из файла.

Здесь документ <<

Это очень полезно, когда вы хотите работать с выходом другой команды или нескольких команд, но не хотите создавать файл.

В своем ответе на вопрос Какая разница между <<, <<< и < < в bash? я показал два простых примера wc < <(echo bar;echo foo) и diff <(ls /bin) <(ls /usr/bin). Последняя особенно полезна - мы сравниваем выходы двух команд, никогда не создавая файл для хранения сравниваемых данных.

Redirection с COMMAND1 > >(COMMAND2)

Эта команда эквивалентна piping.

xieerqi@eagle:~$ df > >(grep "dev" )
xieerqi@eagle:~$ /dev/sda1      115247656 83004376  26365932  76% /
udev             2914492        4   2914488   1% /dev

Как показано в вики Грега, это может быть использовано для передачи одного и того же ввода к нескольким командам

some_command | tee >(grep A > A.out) >(grep B > B.out) >(grep C > C.out) > /dev/null
2
ответ дан 23 November 2019 в 11:39

Другие вопросы по тегам:

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