ser*_*ega 7 bash shell-script background-process process-substitution
我将相同的内容通过tee, 重定向和处理替换子shell传递给多个命令,如下所示:
#!/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 :(
Run Code Online (Sandbox Code Playgroud)
但是,我看到的是进程替换子shell输出在主脚本退出后写入终端并且wait不起作用:
$ ./test.sh
hello
$ hello
hello
hello
Run Code Online (Sandbox Code Playgroud)
如何正确等待进程替换子shell?
在 中bash,您不能等待进程替换。在:
cmd1 > >(cmd2)
Run Code Online (Sandbox Code Playgroud)
整个命令在完成后立即cmd1完成,无论cmd2.
您必须实现一种机制来通知父进程cmd2已完成。一个简单的方法,使用先进先出:
#!/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
Run Code Online (Sandbox Code Playgroud)