stderrとstdoutについてのあれこれ

printf("hello world")とfprintf(stdout,"hello world")が同じことをしてるのはよく知ってると思います。

じゃあfprintf(stderr,"hello world")との違いは?って聞くと、多分「標準出力と標準エラー出力だから出力先が違う」みたいなこと言われるんですけど、どっちみちディスプレイに出力されるんだから、せいぜい可読性を上げるくらいの意味しかなのかなって思ってたら、ちゃんと使い途がありました。

なにが違うのか

まず1番違うのはリダイレクションやパイプを使った場合で、

(gist)

$ gcc -o hoge hoge.c

$ ./hoge >fuga

うちゅうの

$ cat fuga

ほうそくが みだれる

こんな感じでエラー出力はストレートにリダイレクションすることができません。

エラー出力もリダイレクションされてしまうとエラーメッセージの意味を成さないからですね(多分)

エラー出力をリダイレクション

よく「エラー出力は出力先を変更できない」みたいな記事を読みますが、普通にエラー出力もリダイレクションできます。

$ ./hoge 2>fuga

ほうそくが みだれる

$ cat fuga

うちゅうの

2>[ファイル名]でstderrの出力先を変更できます。

エラー出力と標準出力を合わせてリダイレクションしたい場合はこうします。

$ cat ./hoge >fuga 2>&1 $ cat fuga うちゅうの ほうそくが みだれる

crontabでよくやるけど椅子を投げられるやつ。出力先に/dev/nullを指定すれば出力を捨てられます。

こんな感じでstdoutとstderrでは結構扱いが異なります。 ちなみにC言語ではfreopen()を使えばリダイレクションせずに出力先を変更することもできます。