Все мы знаем mkfifo
и конвейеры. Первый создает именованный канал, таким образом нужно выбрать имя, скорее всего, с mktemp
и позже не забудьте удалять связь. Другой создает неименованный канал, никакую стычку с именами и удалением, но концы канала связываются с командами в конвейере, не действительно удобно так или иначе получить власть дескрипторов файлов и использовать их в остальной части сценария. В скомпилированной программе я просто сделал бы ret=pipe(filedes)
; в Bash существует exec 5<>file
таким образом, можно было бы ожидать что-то как "exec 5<> -"
или "pipe <5 >6"
- есть ли что-то как этот в Bash?
В то время как ни одна из оболочек, которые я знаю, не может сделать каналы без разветвления, некоторые действительно имеют лучше, чем основной конвейер оболочки.
В ударе, ksh и zsh, принимая Ваши системные поддержки /dev/fd
(большинство делает в наше время), можно связать вход или вывод команды к имени файла: <(command)
расширяется до имени файла, которое называет канал подключенным к выводу от command
, и >(command)
расширяется до имени файла, которое называет канал подключенным к входу command
. Эту функцию называют заменой процесса. Его основная цель состоит в том, чтобы передать больше чем одну команду по каналу в или из другого, например,
diff <(transform <file1) <(transform <file2)
tee >(transform1 >out1) >(transform2 >out2)
Это также полезно для борьбы с некоторыми недостатками основных каналов оболочки. Например, command2 < <(command1)
эквивалентно command1 | command2
, за исключением того, что его состояние является состоянием command2
. Другой вариант использования exec > >(postprocessing)
, который эквивалентен, но более читаем, чем, вставляя целый отдых сценария { ... } | postprocessing
.
Bash 4 имеет, совместно обрабатывает.
Совместно обрабатывание выполняется асинхронно в подоболочке, как будто команда была завершена с ‘&’ оператор управления с двухсторонним каналом, установленным между выполняющейся оболочкой и совместно обрабатыванием.
Формат для совместно обрабатывания:
coproc [NAME] command [redirections]