mkfifo thepipe
cmd3 <( cmd1 | tee thepipe ) <( cmd2 thepipe )
Isso usa um canal nomeado, thepipe
, para transferir dados entre tee
e cmd2
.
Usando seu diagrama:
cmd1 ---(tee)---(thepipe)--- cmd2 --->
| cmd3
+-------------------------->
Exemplo com
-
cmd1
=echo 'hello world'
, grava uma string na saída padrão. -
cmd2
=rev
, inverte a ordem dos caracteres em cada linha, lê um arquivo ou da entrada padrão. -
cmd3
=paste
, recebe entrada de dois arquivos (neste caso) e produz duas colunas.
mkfifo thepipe
paste <( echo 'hello world' | tee thepipe ) <( rev thepipe )
Resultado:
hello world dlrow olleh
O mesmo, mas colocando o pipe nomeado na outra ramificação em seu diagrama:
cmd1 ---(tee)--------------- cmd2 --->
| cmd3
+-----(thepipe)------------>
cmd3 thepipe <( cmd1 | tee thepipe | cmd2 )
Com nossos comandos de exemplo:
paste thepipe <( echo 'hello world' | tee thepipe | rev )
Isso produz a mesma saída acima.
Existem obviamente outras possibilidades, como
cmd1 | tee >( cmd2 >thepipe ) | cmd3 /dev/stdin thepipe
mas eu não acho que você pode ficar longe de ter que usar um pipe nomeado, a menos que você esteja feliz escrevendo resultados intermediários em um arquivo temporário e dividindo-o em dois conjuntos de comandos.