コマンドラインプログラムは何らかのメッセージを出力する際、標準出力と標準エラー出力の2から選ぶことができる。普通のメッセージは標準出力で、エラーを出力する場合は標準エラー出力を使う。
練習用に以下のファイル “redtest”を作成する。chmod 755して実行可能にしておく。
1 2 3 |
#!/usr/bin/perl print "standard\n"; print STDERR "error\n"; |
このスクリプトは標準出力に”standard”を出力し、標準エラー出力に”error”を出力する。
普通に起動すると、両方画面上に出力される。
$ ./redtest
standard
error
$
以下のように実行すると、標準出力はファイル s に保存されて、標準エラー出力は画面に表示される。
$ ./redtest > s
error
$
以下のように実行すると、標準出力は画面に、標準エラー出力はファイル e に保存される。
$ ./redtest 2> e
standard
$
2は標準エラー出力を表し、1は標準出力を表す。最初の例は 1> と書いても動く。
以下のように書くと、両方の出力をファイル a に保存する。
$ ./redtest > a 2>&1
$
2>&1 は「2を1と同じところに出力する」と読む。ここで以下の例を考える。
$ ./redtest 2>&1 > t
error
$ cat t
standard
$
これだとtには標準出力しか保存されていない。これは最初の 2>&1 で「2を1と同じところに出力する」がここではまだ1は画面なので、「標準エラー出力を画面に出力する」と解釈される。つまりその時さしている最終地点に直接結びつくと言うことだと思う。
さらに1個上の例で作ったファイルを見てみると、”error”の出力の方が先に来ているかもしれない。これはバッファリングに関係しているのだと思うがよく分からなかった。