標準入力、標準出力、標準エラー

LinuxBeginner
オンラインで実践に進む

はじめに

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 つの処理を実行させます。

  1. 現在のディレクトリ . を一覧表示する(成功します)。
  2. /fake を一覧表示する(失敗します)。

次のコマンドを実行します。

ls -l . /fake

出力を注意深く確認してください。2 つの部分が表示されます。

  1. /fake に対するエラーメッセージ。
  2. . に対する正常な一覧。

何が起きたのでしょうか。

エラーは stderr のパイプを通って出力されました。ファイル一覧は stdout のパイプを通って出力されました。ターミナルは両方を受け取り、画面に表示しました。

この違いは非常に重要です。次の実験では、stderr を無視しながら stdout を取得する方法を学びます。

この分離は、単なる理論上の話ではありません。実際の自動化では、スクリプトによって正常な結果を保存しつつエラーを表示したり、役立つデータと混在させずにエラーをログへ記録したりすることがあります。

まとめ

この実験では、2 つの出口を持つ機械のたとえを使って「データストリーム」を確認しました。

  • 標準出力:正常な結果を伝えるチャネル。
  • 標準エラー:エラーメッセージを伝えるチャネル。

デフォルトでは、Linux は両方のストリームを画面上に表示します。次は、それらを分離する方法を学びます。