我使用 、 重定向和进程替换子 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