標準入出力 2

標準出力と標準エラー出力

UNIXで実行されるプログラム・コマンドにはデータが出力先へ出て行く道として 標準出力と標準エラー出力という2つが最初から用意されている。

    標準出力
    ふつうは正常なデータを出力するために使用する。
    標準エラー出力
    何かの異常な状態でエラー表示をするために使用する。

C言語などでプログラムを作る場合には、正しく計算できたデータは標準出力に出力し、データが見つからない、計算結果がおかしい、などの場合には標準エラー出力からエラーメッセージを出力する。
C言語では fprintf(stderr, ...)などを使うと標準エラー出力にデータを出力することができる。 (stderrが標準エラー出力を表している)

2種類のリダイレクションとパイプ

標準出力・標準エラー出力はリダイレクションで切替えることができる。

    # コマンド > ファイル名
    標準出力だけファイルに書き込む。
    # コマンド >& ファイル名
    標準出力・標準エラー出力の両方ともファイルに書き込む。
    # コマンド1 | コマンド2
    コマンド1の標準出力をコマンド2の標準入力に切替える
    # コマンド1 |& コマンド2
    コマンド1の標準出力・標準エラー出力の両方ともコマンド2の標準入力へ切替える。

リダイレクションには上記以外にも いくつかの種類 がある。

例1

標準エラー出力に出力するコマンドの例としてC言語のコンパイラーであるccを取り上げてみる。

# cat test.c
main()
{
	print("hello\n");       <- エラーがある
}
# cc test.c
/tmp/cca123511.o: In function `main':       <- エラーメッセージ
/tmp/cca123511.o(.text+0x9): undefined reference to `print'
# cc test.c > debug       <- エラーメッセージをファイルに書き込もうとしても
/tmp/cca123511.o: In function `main':       <- 表示されてしまう
/tmp/cca123511.o(.text+0x9): undefined reference to `print'
# cc test.c >& debug       <- >&によって始めてファイルに書き込むことができる
# cat debug
/tmp/cca123511.o: In function `main':
/tmp/cca123511.o(.text+0x9): undefined reference to `print'
# cc test.c |& head -1       <- headコマンドによって最初の一行だけ表示する。
/tmp/cca123511.o: In function `main':
#

例2

下のput.cというプログラムを使ってリダイレクションの実験をしてみよう。

# cat put.c
#include <stdio.h>
main()
{
	printf("stdout\n");            /* 標準出力へ出力される */
	fprintf(stderr, "stderr\n");   /* 標準エラー出力へ出力される */
}
# cc -o put put.c
# put
stdout
stderr
# put > data
stderr           <- なぜstderrが出力されたのか?
# cat data
stdout           <- なぜstdoutがdataファイルに書かれているのか?
# put >& data    <- なぜ何も出力されないのか?
# cat data
stdout           <- なぜstdout,stderr両方ともdataファイルに書かれているのか?
stderr
#

参考


Prev
Home | Contents
abe@injapan.net