Bash: создайте анонимный FIFO

Все мы знаем mkfifo и конвейеры. Первый создает именованный канал, таким образом нужно выбрать имя, скорее всего, с mktemp и позже не забудьте удалять связь. Другой создает неименованный канал, никакую стычку с именами и удалением, но концы канала связываются с командами в конвейере, не действительно удобно так или иначе получить власть дескрипторов файлов и использовать их в остальной части сценария. В скомпилированной программе я просто сделал бы ret=pipe(filedes); в Bash существует exec 5<>file таким образом, можно было бы ожидать что-то как "exec 5<> -" или "pipe <5 >6" - есть ли что-то как этот в Bash?

38
задан 03.09.2010, 18:18

2 ответа

В то время как ни одна из оболочек, которые я знаю, не может сделать каналы без разветвления, некоторые действительно имеют лучше, чем основной конвейер оболочки.

В ударе, 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.

23
ответ дан 07.12.2019, 08:49

Bash 4 имеет, совместно обрабатывает.

Совместно обрабатывание выполняется асинхронно в подоболочке, как будто команда была завершена с ‘&’ оператор управления с двухсторонним каналом, установленным между выполняющейся оболочкой и совместно обрабатыванием.

Формат для совместно обрабатывания:

coproc [NAME] command [redirections] 
10
ответ дан 07.12.2019, 08:49

Теги

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