stderr とは何か? 標準エラーストリーム
stderr (標準エラー) は、プログラムがエラーメッセージと診断を write するデフォルトのストリームで、stdout の通常の出力とは分離されています。
プログラムは結果を stdout に、警告とエラーを stderr に write します。両者を分けることで、問題を見ながらクリーンなデータをキャプチャでき、通常の出力をファイルにリダイレクトしても一部のエラーメッセージがなお表示される理由も説明できます。
stderr とは
stderr は file descriptor 2 で、診断のためのチャネルです。エラーメッセージ、警告、進捗の注記は通常ここに行き、プログラムの本来の出力を汚しません。
分離されている理由
stderr は stdout とは異なるストリームなので、プログラムのデータを pipe で先へ送りながら、そのエラーはなお端末に出力できます。> でのリダイレクトは stdout だけをキャプチャし、stderr は見えたままにします。
stderr をリダイレクトする
cmd 2> errors.logは stderr をファイルに送る。cmd 2>&1は stderr を stdout に統合する。cmd > out.log 2>&1は両方のストリームを 1 つのファイルにキャプチャする。
よくある落とし穴
順序が重要です。cmd > out.log 2>&1 は機能しますが、cmd 2>&1 > out.log は stderr をファイルにリダイレクトしません。ストリームは左から右へ接続されるからです。これは多くの CI ログキャプチャスクリプトを引っかけます。
CI における stderr
CI は stdout と stderr を job ログに統合し、しばしば交互に並べます。ツールの出力を解析するときは、stderr の警告が混ざっている可能性があることを忘れないでください。したがって機械可読な結果はクリーンに保つため stdout に属します。
managed runner での失敗の読み取り
Latchkey は両方のストリームを job ログにキャプチャするので、step が失敗したとき stderr のエラーメッセージがそこにあります。診断を stderr に送ることで、下流の解析のために stdout をクリーンに保てます。
重要なポイント
- stderr はエラーと診断のストリームで、file descriptor 2 です。
- データとエラーを独立して扱えるよう、stdout から分離されています。
- リダイレクトの順序が重要です。両方のストリームをキャプチャするには
> out 2>&1を使います。