Bash
等待 Bash 程序替換子shell
我將相同的內容通過管道傳遞給多個命令
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 :(
但是,我看到的是程序替換子shell輸出在主腳本退出後寫入終端並且
wait
不起作用:$ ./test.sh hello $ hello hello hello
如何正確等待程序替換子shell?
在
bash
中,您不能等待程序替換。在:cmd1 > >(cmd2)
整個命令一旦完成就
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