bash 関数/スクリプトではどのような戻り値/終了値を使用できますか?

bash 関数/スクリプトではどのような戻り値/終了値を使用できますか?

たとえば SIGINT と間違われない戻り値としてどのようなものを使用できるかを知りたいです。

元。:

$sleep 10
$#hit ctrl+c
$echo $?
130

だから私は、return 130またはのようなことをしてはいけないことを知っていますexit 130

したがって、これは誤解を招くことになります:

$function FUNC(){ return 130; };FUNC;echo $?
130

答え1

プロセスの終了ステータスは値としてエンコードされます0から255の間なので、終了コードとして使用できるのはこれだけです。その範囲外の値を渡すと、ほとんどのシェルは 256 を法とする剰余を使用します。シェルによっては、関数にさらに広い範囲の整数値を許可しているものもあります。

終了コードに関する唯一のルールは0は成功を意味し、その他の値は失敗を意味しますこのルールは Unix だけにとどまらず、他のオペレーティング システム (DOS、Windows、終了コードの概念を持つ多くの組み込みシステムなど) でも一般的な慣例となっていますが、VMS では異なります。Unix システムでは、シェルのブール構造 ( if、、、、、、、…) に組み込まれ、、に、その後にすべてwhileの標準ユーティリティが続きます。POSIX C プログラムでは、&&||!set -emakeEXIT_SUCCESS0 であり、EXIT_FAILUREゼロ以外の値 (通常は 1) です。

失敗時の終了コードの選択に関するルール(事実上または法律上)はありません。特定の失敗ステータス コードを必須とする POSIX ユーティリティはごくわずかです。

  • シェル!演算子は、オペランドが 0 を返す場合 1 を返します。and&&演算子||は、最後のコマンドのステータスを渡します。
  • cmpそしてdiff異なるファイルの場合は 1 を返し、エラー状態の場合は ≥2 を返します。
  • expr式がゼロまたは null と評価された場合は 1 を返し、無効な式の場合は 2 を返し、その他のエラーの場合は ≥3 を返します。
  • grep「見つからない」場合は 1 を返し、エラー状態の場合は ≥2 を返します。多くの検索コマンドはこれに従います (ただしfind、一致するファイルがない場合に 0 を返す は除きます)。
  • mesgはいの場合は 0、いいえの場合は 1、エラーの場合は ≥2 を返します。
  • patchハンクが拒否された場合は 1 を返し、その他のエラーの場合は ≥2 を返します。
  • sort -cファイルデータがソートされていない場合は 1 を返し、エラーの場合は ≥2 を返します。
  • compressそしてlocaledef特定のエラーに対していくつかの小さな値を定義します。

値が大きいほど失敗が深刻になるという一般的な考え方がありますが、これは普遍的ではありません。grep(このパターンは存在するか?) やdiff(これらのファイルは同一か?) などのブール条件をテストするコマンドの場合、1 は「いいえ」を意味し、値が大きいほどエラーを示します。さらに、126以上の値はほとんど使用されませんこれらはシェルに組み込まれているため (および POSIXコマンドcommand、、、および) :envnicenohuptime

  • 126 および 127 は外部コマンドの呼び出しに失敗したことを示します。
  • 128 を超える値は、$?信号によって終了されたコマンドを示します。

/usr/include/sysexits.hいくつかの値とその意味がリストされていますが、これは sendmail からのものであり、電子メール配信に関係のないプログラム以外では見たことがありません。

要約すると、成功した場合は 0 を返し、失敗した場合は 1 または 2 を返します。失敗のケースを区別する必要がある場合は、1 から始めて、失敗が悪化するほど値を増やします。

答え2

終了ステータスの規則

技術的には、0 から 255 までの任意の値を使用できます。ただし、使用できる既存の規則がいくつかあります。

  • 終了コード1として一般的なエラーの包括的な対処法
  • 終了コード64~78sysexits.hエラーの種類を示すために使用します。一般的には、sysexits.h は、これは、Debian/Ubuntu libc6-dev パッケージによってインストールされます。
  • 終了コードエラー番号。また、エラーmoreutils パッケージのコマンド。私のシステムではerrno --list現在、実行すると 134 個の定義済みエラーが表示されます。

文書と表示

一般的に、スクリプト内で使用される終了コード、または少なくともどの規則に従っているかを文書化しておくことをお勧めします。終了する前に、次のような明確なメッセージを表示することも役立つ場合があります。

# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64

# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2

答え3

0~255の任意の数字を使用できます。予約済みの終了コード詳細はこちらをクリック

関連情報