等待 Bash 进程替换子 shell

等待 Bash 进程替换子 shell

我使用 、 重定向和进程替换子 shell 将相同的内容通过管道传输到多个命令tee,如下所示:

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

但是,我看到的是,进程替换子 shell 输出在主脚本退出后写入终端并且wait不起作用:

$ ./test.sh
hello
$ hello
hello
hello

如何正确等待进程替换子shell?

答案1

在 中bash,您不能等待进程替换。在:

cmd1 > >(cmd2)

整个命令一完成就cmd1完成,无论 的状态如何cmd2

您必须实现一种机制来向父进程发出已cmd2完成的信号。一个简单的方法,使用 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

相关内容