標準出力と標準エラー出力の違いについて

標準出力と標準エラー出力の意味に調べてまとめました。cronでたまに見る「command > /dev/null 2 > &1」の意味も解説します。

標準出力

例えば以下のようにlsコマンドを打ったとしましょう。

f:id:tax1729:20180901103327p:plain

するとカレントディレクトリ上のファイルが表示されます。これが標準出力です。標準出力とは、何も指定しないときにディスプレイに表示される出力のことを言います。標準出力といえば、通常ディスプレイに表示されるメッセージのことだと理解しておけば大丈夫です。

標準エラー出力

では、標準エラー出力とはなんでしょうか。これは、何も指定しないときにディスプレイに表示されるエラーメッセージです。例えば以下のように存在しないファイルを開こうとした場合です。

f:id:tax1729:20180901103157p:plain

この”cat: hoge3: No such file or directory”が標準エラー出力です。エラー出力とは、ディスプレイに表示される出力の中でエラーメッセージに該当するものと考えてください。

標準出力と標準エラー出力の違い

さて標準出力と標準エラー出力は両方ともディスプレイに表示される出力です。じゃあ、なんで呼び方が2つもあるんだと思いませんか。ディスプレイに表示される出力は全部標準出力でいいじゃないかと。

実は標準出力と標準エラー出力は表示されるまでの経路が異なります。なぜわざわざ別の経路を用意したのでしょうか。これは、「標準出力はわざわざ表示させたくないけど、標準エラー出力は表示させたい」というユーザのためです。

例えば、cornのように毎日実行されるジョブの標準出力はわざわざ見る必要はないです。でも、エラーが起きたときは、何が起こったか知りたいというときがあります。標準出力は破棄するけど、標準エラー出力だけ取りたいと思うわけです。

こういう事情のときに出力するまでの経路を分けておけば、標準出力だけの経路をカットすることで標準エラー出力だけ取り出すことができます。便利ですね!

command > /dev/null 2 > &1

たまに以下のようなcronを見ることがあります。

command > /dev/null 2 > &1

初心者は何をやっているかわからないと思います。「command」は何でも良いのでコマンドと考えてください。例えばlsコマンドと思ってください。

「>」の記号は標準出力の出力先を 「/dev/null」 に変えるよという意味です。なのでlsの結果が/dev/null に書き込まれます。

ところで、/dev/null は有名なファイル?です。イメージ的にはブラックホールですね。このファイルに書き込まれたものは、消去されます。なので「ls > /dev/null」というコマンドは、lsの出力結果を消去するという意味です。

その次の「2 > &1」を考えてみましょう。「2」は標準エラー出力という意味です。「1」は標準出力の意味です。「&」追記するという意味です。まとめると、「標準エラー出力を標準出力の結果と結合させる」という意味になります。

なので、「command > /dev/null 2 > &1」は「コマンドの標準エラー出力と標準出力を結合して消去する」という意味になります。エラー出力も消してしまうので、特別な理由がなければ使わないほうがよい記述ですが、結構使っている人がいます。