web-dev-qa-db-ja.com

bash関数/スクリプトで使用できる戻り値/終了値は何ですか?

Exと間違われない、使用できる戻り値を知りたいのですが。 SIGINT?

例:

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

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

これは誤解を招くでしょう:

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

予約済み終了コード以外の0から255までの任意の数値を使用できます( 詳細はこちらをクリック

3
Edward Torvalds

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

終了コードの唯一のルールは、は成功を意味し、その他の値は失敗を意味するです。このルールはUNIXを超えています。これは、他のオペレーティングシステム(DOS、Windows、および終了コードの概念を持つ多くの組み込みシステムを含む)でも一般的な規則ですが、VMSの動作は異なります。 UNIXシステムでは、シェルのブール構造(ifwhile&&||!set -e、 …)、makeに入れ、その後にすべての標準ユーティリティを続けます。 POSIX Cプログラムでは、 EXIT_SUCCESS は0で、EXIT_FAILUREはゼロ以外の値(通常は1)です。

失敗の終了コードの選択に関する規則(事実上または正当な理由)はありません。特定の障害ステータスコードを義務付けるPOSIXユーティリティはごくわずかです。

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

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

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

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

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

終了ステータスの規則

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

  • 一般的なエラーのキャッチオール としてコード1を終了します。
  • sysexits.h の終了コード64-78は、エラーのクラスを示します。これらは通常、Debian/Ubuntu libc6-devパッケージによってインストールされる/ usr/include/sysexits.hで検索できます。
  • errno.h からの終了コード。 moreutilsパッケージのerrnoコマンドを使用してこれらを調べることもできます。私のシステムでは、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
4
CodeGnome