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; cate configura um canal para ele. - O processo bash principal executa
echo foo. Como isso não preenche o buffer do pipe, o comandoechotermina 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 1retorna no subprocesso. O subprocesso continua a executarcat. -
catcopia sua entrada para sua saída (que é exibida na tela) e retorna. - O subshell terminou seu trabalho, sai.
- Depois de outro segundo,
sleep 2retorna. O processo principal do shell termina a execução e você pode ver o próximo prompt.