Skip to content
Latchkey

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 を使います。

関連ガイド