【Linux】標準出力と標準エラー出力は何が違う?

Linuxの標準入出力について

Linuxでは、データのストリーム(データの入出力に伴うデータの流れのこと)を扱うために以下のように、標準出力/標準出力/標準エラー出力の3つの経路(インターフェース)が用意されています.

ファイル・ディスクリプタ番号入出力名
0標準入力
1標準出力
2標準エラー出力

ファイル・ディスクリプタとは、OSが標準入出力の種類を識別するための識別子です.

以下は標準出力と標準エラー入力を出力する例です.

std_out_err.sh

#!bin/bash
echo "標準出力" >&1 # 標準出力
echo "標準エラー出力" >&2 # 標準エラー出力

以下のようにすると、標準出力の内容をファイルへ書き込み、標準エラー出力を端末に表示できます.

$ sh std_out_err.sh > std_out.log
標準エラー出力
$ cat std_out.log
標準出力

>はリダイレクトを意味します. リダイレクトとは、データの入出力をコントロールする機能で、上の例ではechoの標準出力をstd_out.logに書き出す処理をしています.

> は 1> と同義で、1>は標準出力のリダイレクトを意味します. 2> とすると標準エラー出力をリダイレクトできます.

また、以下のように>&を使うと、標準出力と標準エラー出力どちらもリダイレクトできます.

$ sh std_out_err.sh >& std_out_err.log
$ cat std_out_err.log
標準出力
標準エラー出力


なぜ標準出力と標準エラー出力を分けている?

ここで、エラーとそれ以外でデータの経路を分けている理由を何でしょうか.
それは、上の例のように、エラーとそれ以外の出し分けが簡単になるからです.

例えば、毎日実施するバッチがあったとすると、標準出力は必要なくエラーのみログに保存されていて欲しい、ということがあると思います.

この場合は以下のようにすると、標準出力を捨て、エラーのみログに残すことができます.

$ sh std_out_err.sh 2> std_err.log > /dev/null
$ cat std_err.log
標準エラー出力

* /dev/null はnullデバイスと呼ばれ、ここに書き込まれたデータは全て捨てられます.

標準出力と標準エラー出力の経路を別にすることで(1, 2で分けている)、ストリームの扱いが簡潔になります.