Acho que descobri como ajustar sua experiência para transformá-lo em algo que outras pessoas poderão reproduzir:
$ (echo hello; sleep 1; echo world) | tee >(cat) hello hello … and, after a brief delay, world world $ echo "$?" 0 $ (echo hello; sleep 1; echo world) | tee >(echo yo) yo hello $ echo "$?" 141
Como você espera entender,
>(command) cria um pipe
para um processo executando command .
A entrada padrão de command está conectada a um nome de caminho
que outros comandos na linha de comando (neste caso, tee )
pode abrir e escrever para. Quando command é cat ,
o processo fica lá e lê de stdin até obter um EOF.
Nesse caso, tee não tem problema
escrevendo todos os dados que lê do seu stdin para o pipe.
Mas, quando command é echo yo ,
o processo grava yo no stdout e sai imediatamente.
Isso causa um problema para tee ;
quando grava em um pipe sem nenhum processo na outra ponta,
ele recebe um sinal SIGPIPE.
Aparentemente, a versão do OS X de tee
grava primeiro no (s) arquivo (s) na linha de comando e, em seguida, no stdout.
Então, no seu exemplo ( echo hi | tee >(echo yo) ),
tee recebe a falha do pipe em sua primeira gravação.
Considerando que, a versão de tee no Linux e Cygwin
escreve para o stdout primeiro ,
então ele consegue escrever hi na tela antes de morrer.
No meu exemplo aprimorado, tee morre ao gravar hello no pipe,
por isso não tem a chance de ler e escrever world .