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