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) ).