Você pode ver foo
exibido antes de bar
, depois de bar
ou mesmo após o aviso, dependendo do tempo. Adicione um pequeno atraso para obter tempo consistente:
$ echo foo > >(sleep 1; cat); echo bar; sleep 2
bar
foo
$
bar
aparece imediatamente, depois foo
após um segundo e, em seguida, o próximo prompt após outro segundo.
O que está acontecendo é que o bash executa as substituições do processo em segundo plano.
- O processo bash principal inicia um subshell para executar
sleep 1; cat
e configura um canal para ele. - O processo bash principal executa
echo foo
. Como isso não preenche o buffer do pipe, o comandoecho
termina sem bloquear. - O processo bash principal executa
echo bar
. - O processo bash principal inicia o comando
sleep 2
. - Enquanto isso, o subshell está iniciando o comando
sleep 1
. - Após cerca de 1 segundo,
sleep 1
retorna no subprocesso. O subprocesso continua a executarcat
. -
cat
copia sua entrada para sua saída (que é exibida na tela) e retorna. - O subshell terminou seu trabalho, sai.
- Depois de outro segundo,
sleep 2
retorna. O processo principal do shell termina a execução e você pode ver o próximo prompt.