Aguarde por subcascas de Bash

6

Eu canalizo o mesmo conteúdo para vários comandos com tee , sub-shell e redireciona assim:

#!/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 :(

No entanto, o que eu vejo é que a saída da subshell é gravada no terminal depois que o script principal sai e wait não funciona:

$ ./test.sh
hello
$ hello
hello
hello

Como esperar adequadamente pelos subshells?

    
por serega 16.03.2017 / 04:39

1 resposta

5

Em bash , você não pode esperar pela substituição do processo. Em:

cmd1 > >(cmd2)

o comando inteiro termina assim que cmd1 terminar, independentemente do status de cmd2 .

Você precisa implementar um mecanismo para sinalizar o processo pai que o cmd2 finalizou. Um jeito fácil, usando um 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
    
por 16.03.2017 / 05:11