Attendez les soushells de Bash

Je dirige le même contenu vers plusieurs commands avec tee , sous-shell et redirections comme ceci:

 #!/usr/bin/env bash echo 'hello' | tee \ >( sleep 3; cat /dev/stdin ) \ >( sleep 2; cat /dev/stdin ) \ >( sleep 1; cat /dev/stdin ) wait # Doesn't work :( 

Cependant, ce que je vois, c'est que la sortie sous-shell est écrite dans le terminal après que le script principal a quitté et que l' wait ne fonctionne pas:

 $ ./test.sh hello $ hello hello hello 

Comment attendre correctement les sous-coquilles?

En bash , vous ne pouvez pas attendre la substitution du process. Dans:

 cmd1 > >(cmd2) 

la command entière se termine dès la fin de cmd1 , quel que soit le statut de cmd2 .

Vous devez implémenter un mécanisme pour signaler le process parent que le cmd2 a terminé. Un moyen facile, en utilisant un fifo:

 #!/usr/bin/env bash trap 'rm wait.fifo' EXIT mkfifo wait.fifo echo 'hello' | tee \ >( sleep 3; cat /dev/stdin; : >wait.fifo ) \ >( sleep 2; cat /dev/stdin; : >wait.fifo ) \ >( sleep 1; cat /dev/stdin; : >wait.fifo ) for (( i=0;i<3;i++ )); do read <wait.fifo; done