パイプで連結したコマンドは並列実行される
シェルでコマンドをパイプで繋いで実行した場合、順番に実行されるのではなく、並列実行されると本に書かれてあったので、軽く検証した。
まず、以下のシェルを作成(ファイル名は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を使う方法とパイプを使う方法があるが、パイプを使う方が少し速かった。
パイプを使うことで子プロセスが生じ並列処理されたのだろう。