on-the-fly и постоянные теги не существовали, таких терминов, специфичных для UNIX или Linux, не существовало.
В системах с двунаправленными каналами (не Linux) вы можете:
cmd0 <&1 | cmd1 >&0
В Linux вы можете:
{ cmd0 < /dev/fd/3 | cmd1 3>&-; } 3>&1 | :
Это работает, потому что в Linux (и только Linux) / dev / fd / x
, где x
- это fd канала (с именем или без него), действует как именованный канал, то есть открывая его в режим чтения дает вам конец чтения, а в режиме записи - конец записи.
С оболочкой yash
и ее оператором перенаправления конвейера x >> | y
:
{ cmd0 <&4 3<&- 4<&- | cmd1 >&3 3>&- 4>&-; } 3>>|4
С оболочками с поддержкой coproc :
zsh:
coproc cmd0
cmd1 <& p> & p
ksh
cmd0 | &
cmd1 <& p> & p { {1}}
bash4 +
coproc cmd0
cmd1 <& "$ {COPROC [0]}"> & "$ {COPROC [1]}"
Некоторые подходы на основе специальных инструментов (бесстыдно скопировано из ответов на этот очень похожий вопрос ):
pipexec [ A /path/to/cmd0 ] \ [ B /path/to/cmd1 ] \ '{A:1>B:0}' '{A:0>B:1}'
Или:
dpipe cmd0 = cmd1
Или:
socat EXEC:cmd0 EXEC:cmd1,nofork # using socketpairs socat EXEC:cmd0,commtype=pipes EXEC:cmd1,nofork # using pipes
Я не знаю о python
, но это также относительно легко сделать в perl
:
perl -e 'pipe STDOUT,STDIN; exec "cmd0 | cmd1"'
В любом случае остерегайтесь тупиковых ситуаций!