プロセス置換を複数渡す

teeコマンドには複数のファイルパスを渡せるが、プロセス置換>(コマンド)を複数渡すこともできる。標準入力の内容がそれぞれのコマンドの標準入力に渡り、並行して処理される。

コマンド | tee >(コマンド1) >(コマンド2) > /dev/null
$ seq 1 10 | tee >(wc -l > count.txt) >(wc -c > bytes.txt) > /dev/null
$ wait
$ cat count.txt
10
$ cat bytes.txt
21

wc -lによる行数カウントとwc -cによるバイト数カウントを、同じ標準入力に対して同時に実行している。最後の> /dev/nullは、teeコマンド自体の標準出力(画面表示用)が不要なため付けている。

waitが必要な理由

プロセス置換で起動したコマンドは、teeコマンドとは別のバックグラウンドプロセスとして動く。teeコマンドはすべてのプロセス置換への書き込みが終わった時点で終了するが、書き込みを受け取った側のコマンド(wcなど)の処理が終わっているとは限らない。

$ seq 1 10 | tee >(wc -l > count.txt) > /dev/null
$ cat count.txt

上記のようにwaitを挟まずにcatを実行すると、wc -lの処理が終わる前にcount.txtを読んでしまい、空の結果になることがある。waitでバックグラウンドプロセスの終了を待ってから後続の処理に進む。

用途

同じ標準入力に対して複数の集計・変換処理を同時に走らせたい場合に使える。パイプを複数回に分けて同じコマンドを何度も実行するより、1回の入力読み込みで済ませられる。