Bash

等待 Bash 程序替換子shell

  • June 24, 2020

我將相同的內容通過管道傳遞給多個命令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

引用自:https://unix.stackexchange.com/questions/351780