stderr(標準エラー出力)
100%

テキスト操作 · レッスン 3

stderr(標準エラー出力)

Bash で標準エラーを個別にリダイレクトする方法と、標準出力へまとめる方法を学びます。

プログラムは通常、通常の結果を標準出力へ、診断メッセージを stderr(標準エラー)という別のストリームへ書き出します。ストリームを分けることで、エラーメッセージを混ぜずに有用なデータを保存できます。

通常の出力とエラーを分ける

存在しないパスを指定したコマンドを考えます。

$ ls /fake/directory > peanuts.txt
ls: cannot access '/fake/directory': No such file or directory

> 演算子がリダイレクトするのは stdout だけです。診断は stderr へ書かれ、stderr は端末に接続されたままです。一方、ls が通常の結果を生成しなくても、シェルは stdout 用に peanuts.txt を作成または切り詰めます。

標準ストリームには慣例として次のファイルディスクリプタが使われます。

  • 0:stdin(標準入力)
  • 1:stdout(標準出力)
  • 2:stderr(標準エラー)

ls /missing > results.txt のエラーが通常、端末に残るのはなぜですか?

2> で stderr をリダイレクトする

> の前にファイルディスクリプタ 2 を置くと stderr をリダイレクトできます。

$ ls /fake/directory 2> errors.txt

シェルは errors.txt を作成または切り詰め、ディスクリプタ 2 へ接続します。stdout の出力先は変わりません。エラー出力を追記する場合は 2>> errors.txt を使います。

find /restricted の診断で errors.log を置き換え、stdout の出力先は変えないコマンドはどれですか?

stdout と stderr をまとめる

両方を 1 つのファイルへ入れるには、まず stdout をリダイレクトし、次に stderr を stdout の現在の出力先へ複製します。

$ ls /fake/directory /etc/passwd > combined.txt 2>&1

リダイレクトは左から右へ処理されます。

  1. > combined.txt が stdout をファイルへ接続します。
  2. 2>&1 が stderr を、その時点で stdout が指している出力先へ接続します。

順序を逆にすると結果が変わります。

$ ls /fake/directory /etc/passwd 2>&1 > regular.txt

ここでは stderr が最初に stdout の元の端末出力先を複製します。その後 stdout だけが regular.txt へ移るため、2 つのストリームは別の場所へ送られます。

command の stdout と stderr を両方とも all.log へ送る Bash のリダイレクトはどれですか?

Bash では、両方のストリームでファイルを置き換える短い構文 &> も使えます。

$ ls /fake/directory /etc/passwd &> combined.txt

Bash で両方を追記するには &>> を使います。> file 2>&1 という明示的な形も、シェルスクリプトや文書でよく使われるため覚えておきましょう。

build の stdout と stderr を両方とも build.log へ追記する Bash コマンドはどれですか?

ストリームを意図的に破棄する

/dev/null は書き込まれたデータを破棄する特殊なデバイスです。診断が想定内で不要だと確認した場合にだけ、stderr をそこへリダイレクトします。

$ ls /fake/directory 2> /dev/null

これはコマンドを成功させるものでも、終了ステータスを変えるものでもなく、診断ストリームを隠すだけです。トラブルシューティング中は、必要な情報を破棄せず保存または表示しましょう。

check-data 2> /dev/null は何を変更しますか?

3 つの標準ストリームの管理を練習するには、次のハンズオンラボを試してください。

  1. Linux における入出力のリダイレクト - >>>2> などの演算子や tee コマンドを使い、標準出力、標準エラー、標準入力を操作してデータフローを制御します。

レッスン完了

stderr(標準エラー出力) を完了しました

診断を通常のコマンド出力から分けたり、両者をまとめたりできるようになりました。

  • stderr がファイルディスクリプタ 2 であることを認識する。

  • 2> または 2>> でエラーログを置き換えるか追記する。

  • 複数のリダイレクトを左から右へ適用する。

  • 意図に合った構文で両方の出力ストリームをまとめる。

  • 情報を失ってもよい場合にだけ診断を破棄する。

学習進捗を保存

無料アカウントを作成してこのレッスンを保存し、どのデバイスからでも学習を続けられます。

無料アカウントを作成
次のレッスン
テキスト操作 に戻る