Skip to content
Latchkey

exit code 1 vs exit code 2: その違いの意味

exit 1は「何かが失敗した」、それだけだ。exit 2は慣例的に「使い方を間違えた」 - 不正な引数や構文 - を意味するが、多くのツールがこの規則を曲げる。

1も2もどちらも通常の非ゼロの失敗だが、異なる根本原因を示唆する。緩い慣例を知ることで、デバッグをより速く正しい方向へ向けられる。

exit code 1: 一般的な失敗

慣例上、1は「操作が失敗した」の万能コードだ。失敗したテスト、buildエラー、assertion、マッチしない非空のgrep - もっと具体的なコードがないとき、何かがうまくいかなかった場合、ほぼすべてのツールが1に手を伸ばす。

exit code 2: 誤用 / 使用法エラー

多くのプログラムとshell自体が、2を「不正に呼び出した」 - 未知のフラグ、必須引数の欠落、構文エラー - に使う。Bashはshell構文エラーに2を返す; grepのようなツールは、「マッチなし」の1に対し、*エラー*(不正なファイル、不正なregex)に特に2を使う。

規則が緩い理由

0より上に強制された標準はない。多くのツール(make、pytest、linter)が1と2に独自の意味を定義するため、慣例は保証ではなくヒントだ。常に特定のツールが文書化しているexit codeと照合する。

CIでの対処法

  • exit 1 → ログを読む; 使用法の問題ではなく、実際の失敗だ。
  • exit 2 → コマンド内の不正なフラグ、欠落した引数、構文エラーを疑う。
  • 不明なら、そのツールのドキュメントを確認する - 1と2は慣例の上でツールが定義する。

重要なポイント

  • exit 1は、ほぼすべてが使う一般的な「失敗した」コードだ。
  • exit 2は慣例的に誤用を意味する: 不正な引数や構文エラー。
  • 慣例は緩い - 多くのツールが1と2を自分用に再定義する。
  • CIでは、exit 2は出力だけでなくコマンドを読み返させるべきだ。

関連ガイド