パイプで連結したコマンドは並列実行される

シェルでコマンドをパイプで繋いで実行した場合、順番に実行されるのではなく、並列実行されると本に書かれてあったので、軽く検証した。

まず、以下のシェルを作成(ファイル名はcom)。
1秒ごとにメッセージを標準出力に表示するものである。

1#!/bin/bash
2
3cnt=1
4while [ $cnt -le 10 ]
5do
6	echo "$cnt 回目"
7	sleep 1
8    cnt=`expr $cnt + 1`
9done

まず、以下コマンドにて、パイプではなく順次実行してみる。
./com > tmp; head < tmp

この処理の最終的な結果は、以下のパイプを使った場合と同じである。
./com | head

実際に動かした様子を、下の方に動画で示す。
確かにパイプを使うと並列で動いているようだ。

また、以下コマンドを実行したところ、headの出力が確定した時点でcomの完了を待たずに全体の処理が完了した。
./com | head -3

ところで、sedコマンドで複数の置換を行うときに、-eを使う方法とパイプを使う方法があるが、パイプを使う方が少し速かった。
パイプを使うことで子プロセスが生じ並列処理されたのだろう。

関連ページ