標準入出力 3

パイプ

あるコマンドの標準出力・標準エラー出力を別のコマンドの標準入力へ入力する機能である。
このパイプによって2つ以上のコマンドを一つのコマンドのように実行できるようになる。

2種類のパイプ

    (コマンド1) | (コマンド2)
    コマンド1の標準出力だけコマンド2の標準入力に入力する。
    (コマンド1) |& (コマンド2)
    コマンド1の標準出力・標準エラー出力の両方ともコマンド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ループが終るようにしている。

参考


Prev | Next
Home | Contents
abe@injapan.net