あるコマンドの標準出力・標準エラー出力を別のコマンドの標準入力へ入力する機能である。
このパイプによって2つ以上のコマンドを一つのコマンドのように実行できるようになる。
パイプには上記以外にもいくつかの種類がある。
下のputプログラムから出たデータがgetプログラムにパイプを通してどのように送られてゆくかを 考えてみよう。
# cat put.c
#include <stdio.h>
main()
{
printf("stdout\n"); /* 標準出力へ出力される */
fprintf(stderr, "stderr\n"); /* 標準エラー出力へ出力される */
}
# cat get.c
#include <stdio.h>
main()
{
char s[128];
while(scanf("%s", s) == 1){ /* データの終りがきたらwhileループを終る */
printf("get : %s\n", s); /* 読み込んだ文字列にget : を付けて出力する */
}
}
# cc -o put put.c
# cc -o get get.c
# put
stdout
stderr
# get
test
get : test
Ctrl+d <- Ctrlキーとdキーを同時に押すとデータの終りになる
# put | get
get : stdout <- なぜget : が付いているのか?
stderr <- なぜget : が付いていないのか?
# put |& get
get : stdout <- なぜ両方ともget : が付いているのか?
get : stderr
#
このgetのように標準入力からデータを読み込んで、 標準出力に書き出すようなコマンドのことをフィルターコマンドと言う。
上のget.cの中の scanf("%s", s) == 1 の部分で、なぜ1と比較しているかと言うと
scanfは読み込んだデータの個数を帰り値として返すので
読み込んだデータの数が1以外になった時がデータの終りが来た時になる。
(実際はデータの終りがくるとEOFが帰ってくる)
だから、その時にwhileループが終るようにしている。