Eu teria suposto que este código teria impresso " oof " primeiro:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
Resultado:
foo
oof
Aumentar o sleep
tempo não altera a ordem. Por que isso não funciona?
Observe que outras ferramentas funcionam como esperado, por exemplo : echo foo | pee rev 'sleep 1 ; cat'
.
Dentro
Como
bash
emksh
, mas diferentezsh
de , o stdout derev
também é o canal para(sleep 1; cat)
.echo
,tee
,rev
e o(...)
subshell são iniciados ao mesmo tempo, mastee
gravamfoo\n
em stdout antes do canal pararev
, portanto, em qualquer caso,rev
gravarãooof
no canal após astee
gravaçõesfoo
, portanto,oof
só podem vir por último. Atrasarcat
não tem incidência.Se você quisesse que a saída de
rev
não passasse pelo canal para(sleep 1; cat)
, você usariazsh
ou faria:Observe que
zsh
também possui um recurso embutidotee
,multios
para que você possa fazer:Porém em:
A saída de
rev
passariacat
(confusamente considerando que não acontece noecho foo >(echo bar) | (sleep 1; cat)
caso).Parece que usar duas
bash
substituições de processo (em vez de apenas uma, depois um pipe) funciona conforme o esperado:Resultado:
Observe que o segundo
sleep
impede que " foo " seja impresso após o prompt de comando.