Bashプロセスがサブシェルを交換するのを待ちます。

Bashプロセスがサブシェルを交換するのを待ちます。

私はサブシェル、リダイレクト、およびプロセス置換を使用して、同じコンテンツを次のようないくつ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 :(

しかし、私が見たのは、基本スクリプトが終了した後にプロセス交換サブシェル出力が端末に書き込まれ、機能しないことwaitです。

$ ./test.sh
hello
$ hello
hello
hello

プロセスがサブシェルを交換するのを正しく待つ方法は?

答え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

関連情報