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
.