9.4 パイプ

bc などのように、標準入力から何かを受取り、標準出力にその結果を返すようなコマンドをフィルタコマンド [1] と呼んでいます。

先ほどの例で、 bc.out というファイルが結果として出来上がっていると思いますが、例えばこのファイルの中身を数字の小さいもの順に並べ替える [2] 為に、 sort コマンドの利用を考えます。
sort もフィルタコマンドですから、実行は以下のようにする事になるでしょう。 -n オプションはソートの順番を数値の小さいもの順にするためのオプションです。

cc2000(94)% bc < bc.in > bc.out
cc2000(95)% sort -n < bc.out 
2
3
6
cc2000(96)%

単純なコマンドでも、それを組み合わせて実行すると、なかなか便利な [3] ものです。
ところで上記のコマンド2つの組み合わせを、少し簡単に表現できるような仕掛けが UNIX には用意されています。以下の例を見てください。

cc2000(97)% bc < bc.in | sort -n
2
3
6
cc2000(98)% 

2つのコマンドを一行で書いています。
リダイレクションを使わないために中間的に発生していた bc.out ファイルも必要ありません。

このような、コマンドとコマンドをつなぐ「 | 」記号を「パイプ」と呼んでいます。パイプがあれば、パイプの左のフィルタコマンドは標準出力をパイプの右のコマンドの標準入力につなぎ合わせて実行くれます。

例えば cat コマンドもフィルタコマンドですから、上の例は以下のようにも書き換えられます。

cc2000(98)% cat bc.in | bc | sort -n
2
3
6
cc2000(99)% 

パイプは幾つでも重ねて使うことができます。

あまり実用的な例ではありありませんが、 echo コマンドを使えば簡単な計算を標準入力からキーボード入力しないで処理するような組み合わせもできます。

cc2000(99)% echo '3 * 4' | bc
12
cc2000(100)% 

UNIXではパイプとリダイレクションを応用することによって、各種のコマンドを柔軟に組み合わせて実行することができます。



Yutaka Yasuda (yasuda@bakkers.gr.jp)