Оболочка: взаимное соединение STDIN / STDOUT двух команд [дубликат]

on-the-fly и постоянные теги не существовали, таких терминов, специфичных для UNIX или Linux, не существовало.

3
17.07.2016, 14:03
1 ответ

В системах с двунаправленными каналами (не 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"'

В любом случае остерегайтесь тупиковых ситуаций!

17
27.01.2020, 21:08

Теги

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