UNIXで実行されるプログラム・コマンドにはデータが出力先へ出て行く道として 標準出力と標準エラー出力という2つが最初から用意されている。
C言語などでプログラムを作る場合には、正しく計算できたデータは標準出力に出力し、データが見つからない、計算結果がおかしい、などの場合には標準エラー出力からエラーメッセージを出力する。
C言語では fprintf(stderr, ...)などを使うと標準エラー出力にデータを出力することができる。
(stderrが標準エラー出力を表している)
標準出力・標準エラー出力はリダイレクションで切替えることができる。
リダイレクションには上記以外にも いくつかの種類 がある。
標準エラー出力に出力するコマンドの例として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': #
下の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 #