Antes de 5.0.8, zsh
não podia esperar por trabalhos já mortos. Isso foi alterado em 5.0.8 em 2014. Veja a alteração existente .
Aqui, você pode apenas redirecionar o stderr para /dev/null
para ignorar o problema:
wait $pid 2> /dev/null
Observe que em:
{ tee $tmpdir/orig | arbitrary_pipeline > $tmpdir/alt; } &
como uma otimização, zsh
não irá bifurcar um processo extra para arbitrary_pipeline
, ele irá executá-lo no mesmo processo que aquele que executa essa sub-inicial em segundo plano.
paste
não terminará antes de ver EOF em seu stdin, sendo seu stdin o canal em que $pid
(e seus filhos, se algum) está escrevendo no outro extremo. Portanto, ele não verá eof até que $pid
(e filhos) tenha fechado todos os descritores de arquivo (geralmente apenas stdout) na extremidade de gravação do canal. A menos que $pid
feche explicitamente seu stdout (o que é muito incomum), isso só acontecerá quando sair.
O que isso significa é que paste
, na maioria dos casos, não sairá antes de $pid
, ainda é uma boa ideia fazer o wait
apenas no caso.
Note que aqui você pode usar um coproc
para evitar os fifos temporários:
coproc arbitrary_pipeline
cat >&p | paste - /dev/fd/3 3<&p &
coproc : close
wait
(observe que wait
também aguarda o coproc
s).