はじめに
Linux の各コマンドを機械だと考えてみましょう。機械の一方からデータが入り、機械がそれを処理します。ただし、出力口が 1 つだけの単純な機械とは異なり、Linux コマンドには処理結果を外へ送るための独立した 2 つの出口があります。
- 標準出力(stdout):「正常な結果の出口」です。機械が正常に動作すると、完成した結果がここから出力されます。
- 標準エラー(stderr):「エラーの出口」です。問題が発生すると、エラーメッセージがここから出力されます。
デフォルトでは、どちらの出口から出た内容も画面に表示されます。
この「ストリーム」モデルは、シェルを扱ううえで最も重要な考え方の 1 つです。Linux コマンドは単に「テキストを表示」するのではなく、構造化されたデータの流れを生成することがあります。この流れを理解すると、リダイレクトやパイプラインを不思議な仕組みではなく、論理的なものとして理解できるようになります。
この実験では、コマンドを実行して、これら 2 種類のストリームがどのように動作するかを確認します。
標準出力(stdout)
まず、「正常な結果の出口」の動作を確認します。
ファイルを一覧表示する ls を使用します。ls が正常に動作すると、ファイル名が標準出力に送られます。
次のコマンドを実行します。
ls -l
ファイルの一覧が表示されます。
何が起きたのでしょうか。
コマンドが正常に実行されたため、ls プログラムは一覧を stdout ストリームに送りました。ターミナルはこのストリームを監視し、その内容を画面に表示します。
重要なのは、ターミナルが標準出力のデフォルトの送信先にすぎないという点です。標準出力が画面に固定されているわけではありません。そのため、後で標準出力を保存したり、別の場所へリダイレクトしたりできます。
標準エラー(stderr)
次に、「エラーの出口」を確認します。標準エラー(stderr)は、エラーを伝えるために使用されます。
存在しないディレクトリを一覧表示するよう ls に指示して、エラーを発生させます。
次のコマンドを実行します。
ls -l /nonexistent_directory
エラーメッセージが表示されます。
何が起きたのでしょうか。
コマンドは失敗しました。stdout ではなく、メッセージを stderr ストリームに送りました。
ターミナルはデフォルトで 両方 のストリームを監視するため、通常のテキストと同じようにエラーを画面に表示します。
このため、初心者は正常な結果のメッセージとエラーメッセージを「同じ種類の出力」だと考えがちです。画面上では似て見えますが、内部では異なる経路を通っています。
混在した出力
次に、コマンドが両方のストリームに出力する場合を確認します。
ls に次の 2 つの処理を実行させます。
- 現在のディレクトリ
.を一覧表示する(成功します)。 /fakeを一覧表示する(失敗します)。
次のコマンドを実行します。
ls -l . /fake
出力を注意深く確認してください。2 つの部分が表示されます。
/fakeに対するエラーメッセージ。.に対する正常な一覧。
何が起きたのでしょうか。
エラーは stderr のパイプを通って出力されました。ファイル一覧は stdout のパイプを通って出力されました。ターミナルは両方を受け取り、画面に表示しました。
この違いは非常に重要です。次の実験では、stderr を無視しながら stdout を取得する方法を学びます。
この分離は、単なる理論上の話ではありません。実際の自動化では、スクリプトによって正常な結果を保存しつつエラーを表示したり、役立つデータと混在させずにエラーをログへ記録したりすることがあります。
まとめ
この実験では、2 つの出口を持つ機械のたとえを使って「データストリーム」を確認しました。
- 標準出力:正常な結果を伝えるチャネル。
- 標準エラー:エラーメッセージを伝えるチャネル。
デフォルトでは、Linux は両方のストリームを画面上に表示します。次は、それらを分離する方法を学びます。



