Em
echo foo | tee >(rev) | (sleep 1; cat)
Em bash
como em ksh
, mas ao contrário de zsh
, o stdout de rev
também é o canal para (sleep 1; cat)
.
echo
, tee
, rev
e o (...)
subshell são iniciados ao mesmo tempo, mas tee
escreve foo\n
para stdout antes do pipe para rev
, portanto, em qualquer caso, rev
gravará oof
no canal depois de tee
gravar foo
, portanto, oof
só pode vir por último. Atrasar cat
não tem incidência.
Se você quiser que a saída de rev
não passe pelo canal até (sleep 1; cat)
, use zsh
ou faça:
{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1
Tenha em atenção que zsh
também possui uma tee
incorporada na funcionalidade multios
, pelo que pode:
echo foo > >(rev) > >(sleep 1; cat)
No entanto, em:
echo foo > >(rev) | (sleep 1; cat)
A saída de rev
passará por cat
(considerando, de forma confusa, que não está no caso echo foo >(echo bar) | (sleep 1; cat)
).