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

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

ex.と間違えないように、私たちが使用できる戻り値が何であるかを知りたいです。信号知能?

前任者。 :

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

だから私は次のものが利用できないことを知っていますreturn 130exit 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式が 0 または null と評価された場合は 1 を返し、式が無効な場合は 2 を返し、その他のエラーでは ≥3 を返します。
  • grep「見つかりません」の場合は1を返し、エラー条件の場合は≥2を返します。多くの検索コマンドがこれに従います(ただし、find一致するファイルがない場合は0を返しません)。
  • mesgYesの場合は0、Noの場合は1、エラーの場合は≥2を返します。
  • patchブロックが拒否された場合は1を返し、その他のエラーの場合は≥2を返します。
  • sort -cファイルデータがソートされていない場合は1を返し、エラーがある場合は≥2を返します。
  • compressそしてlocaledef特定のエラーに対して小さな値を定義します。

大きな値がより深刻な失敗を意味するという共通の信念がありますが、普遍的ではありません。grep(このパターンは存在しますか?)やdiff(このファイルは同じですか?)などのブール条件をテストするコマンドの場合、1は「いいえ」を意味し、値が高いほどエラーを示します。また、126以上の値はほとんど使用されません。commandenvこれは、POSIXコマンドniceと一緒にシェルに書き込まれるためですnohuptime

  • 126及び127は、外部コマンド呼び出しの失敗を示す。
  • 128 以上の値は、$?コマンドが信号によって終了したことを示します。

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

つまり、成功した場合は0、失敗した場合は1または2を返します。障害条件を区別する必要がある場合は、1から始めて、より深刻な障害の値を増やします。

答え2

終了ステータスルール

技術的には、0から255までの値を使用できます。ただし、さまざまな既存のルールを使用できます。

  • 終了コード1包括的な一般的なエラー
  • 終了コード64-78は次のようになります。sysexits.hエラーのカテゴリを示します。一般的には、以下にあります。/usr/include/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までの数字を使用できます。終了コードを保持詳細については、ここをクリックしてください。)

関連情報