プログラムは通常、通常の結果を標準出力へ、診断メッセージを stderr(標準エラー)という別のストリームへ書き出します。ストリームを分けることで、エラーメッセージを混ぜずに有用なデータを保存できます。
テキスト操作 · レッスン 3
stderr(標準エラー出力)
Bash で標準エラーを個別にリダイレクトする方法と、標準出力へまとめる方法を学びます。
通常の出力とエラーを分ける
存在しないパスを指定したコマンドを考えます。
$ 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
リダイレクトは左から右へ処理されます。
> combined.txtが stdout をファイルへ接続します。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 つの標準ストリームの管理を練習するには、次のハンズオンラボを試してください。
- Linux における入出力のリダイレクト -
>、>>、2>などの演算子やteeコマンドを使い、標準出力、標準エラー、標準入力を操作してデータフローを制御します。
レッスン完了
stderr(標準エラー出力) を完了しました
診断を通常のコマンド出力から分けたり、両者をまとめたりできるようになりました。
stderr がファイルディスクリプタ 2 であることを認識する。
2>または2>>でエラーログを置き換えるか追記する。複数のリダイレクトを左から右へ適用する。
意図に合った構文で両方の出力ストリームをまとめる。
情報を失ってもよい場合にだけ診断を破棄する。