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.