シェルスクリプトの終了状態で「予約済み」コードを使用する

シェルスクリプトの終了状態で「予約済み」コードを使用する

最近このリストを見ました。特別な意味を持つ終了コード高度なBashスクリプトガイドから抜粋。彼らはこれらのコードを呼び出します予約済みそして以下をお勧めします:

上記の表によれば、終了コード1-2、126-165、および255は特別な意味を持ち、ユーザーが指定した終了パラメータには使用しないでください。

しばらく前に、次の終了ステータスコードを使用するスクリプトを作成しました。

  • 0 - 成功
  • 1 - 無効なホスト名
  • 2 - 指定されたパラメータが無効です。
  • 3 - ユーザー権限が不足しています。

スクリプトの作成時に特別な終了コードが認識されなかったため、最初のエラー条件に対して1で始まり、連続するエラータイプごとに終了ステータスが増加しました。

後で別のスクリプト(0以外の終了コードを確認できます)から呼び出すことができるようにこのスクリプトを作成しました。私は実際にこれをまだやっていません。これまでは、対話型シェルでのみスクリプトを実行しており、カスタム終了コードの使用に問題があるかどうか疑問に思いました。 Advanced Bash Scripting Guideのアドバイスはどれくらい関連性があり重要ですか?

Bashドキュメントセクションで確認されたアドバイスが見つかりません。終了ステータスBashが使用する終了コードのみをリストしますが、そのコードが何であるかは明らかではありません。予約済みまたは、独自のスクリプト/プログラムで使用しないでくださいという警告です。

ベストアンサー1

いいえ終了コード特別な意味がありますが、inの値も$?特別な意味を持つことができます。

$?問題は、Bourne Shellとksh93が終了コードとエラー条件を処理し、それをシェル変数に渡す方法です。あなたがリストしたものとは異なり、次の値だけが$?特別な意味を持ちます。

  • 126バイナリがあり、実行できません。
  • 127指定したバイナリファイルが存在しません。
  • 128 終了ステータスは == 0 ですが、指定されていない問題があります。

$?また、シグナルによって中断されたプログラム用に予約されている未指定のシェルおよびプラットフォーム固有のコード範囲> 128があります。

  • Bourne Shell bashとksh88は128+セマフォを使用します。
  • ksh93は256以上の信号番号を使用します。

$?他の値はシェルの特殊値と異なる可能性があるため、問題は発生しません。

特に、1 と 2 の値は特殊な条件に使用されるのではなく、単に組み込み命令で使用する終了コードに過ぎず、組み込み命令でない場合でも同じ目的で使用されます。ポインタが次を指しているようです。Bash スクリプトガイドあなたが提供したマニュアルは、特定のコードがあなたのスクリプトで避けるべき特別な値であるかどうかについて言及せずにbashが使用するコードだけをリストするので、それは良いことではありません。

最新バージョンのBourne Shellは、プログラムが終了するのを待つwaitid()のではなく(1989年にSVr4用に導入されました)、より良いシステムコールインターフェイス(1980年にUNOSで使用されたインターフェイスと同様)を使用します。waitpid()waitid()

最新のBourne Shellバージョンエンコーディングの使用退会理由別の変数に${.sh.code}/${.sh.codename}終了コード${.sh.status}/${.sh.termsig}に位置http://schillix.sourceforge.net/man/man1/bosh.1.html、終了コードは特別な条件のためにオーバーロードされず、`waitid()の使用のおかげで、Bourne Shellは下位8ビットだけでなく、32ビット終了コードの返却をサポートします。

注:Cプログラムやシェルスクリプトに似ていないように注意してくださいexit(256)。これにより、$?クラシックシェルでゼロと解釈されます。

おすすめ記事