web-dev-qa-db-ja.com

コマンド/ユーティリティの終了コード(および/または戻りコード)と意味のリストを取得するにはどうすればよいですか?

端末コマンドからタイトルに記載されていることを実行する方法はありますか、それともコードを調べる必要がありますか?

17
precise

特定の端末コマンドの終了ステータスの意味を取得するための「レシピ」はありません。

私の最初の試みはマンページになります:

user@Host:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

2番目Google 。例として wget を参照してください。

Third:シェルの終了ステータス(bashなど)。 Bashとそのビルトインは、125を超える値を特別に使用する場合があります。コマンドが見つからない場合は127、実行できないコマンドの場合は126。詳細については、 bash終了コード を参照してください。

16
chaos

終了コードは、プログラムの終了時の障害状態を示し、それらは0〜255の範囲にあります。シェルとその組み込みは、特に125を超える値を使用して特定の障害モードを示す場合があるため、コードのリストはシェルとオペレーティングシステム(Bashなど)によって異なる場合があります。終了ステータスとして値128 + Nを使用します)。参照: Bash-3.7.5終了ステータス または_man bash_。

一般的にゼロ終了ステータスは、コマンドが成功したことを示しますゼロ以外の終了ステータスは、失敗を示します。

コマンドによって返されるエラーコードを確認するには、最後の終了コードの_$?_または pipeline からの終了ステータス値のリストを示す_${PIPESTATUS[@]}_を出力します(Bash内) )シェルスクリプトの終了後。

見つけることができるすべての終了コードの完全なリストはありませんが、カーネルソースで終了ステータス番号を体系化する試みがありましたが、これは主にC/C++プログラマーを対象としており、スクリプトの同様の標準が適切な場合があります。

LinuxとBSD/OS Xの両方のsysexitのいくつかのリストは、プログラムの望ましい終了コード(64-78)とともに_/usr/include/sysexits.h_(またはBSDでは_man sysexits_)にあります。

_0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* Host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */
_

上記のリストは、以前使用されていない64〜78の終了コードを割り当てます。未割り当ての終了コードの範囲は、将来さらに制限されます。

ただし、上記の値は主にsendmailで使用され、他のほとんどの人が使用していないため、標準にリモートで近いものはありません( @ Gilles で示されるように)。

シェルでは、終了ステータスは次のとおりです(Bashに基づく):

  • _1_-_125_-コマンドは正常に完了しませんでした。ステータスの意味については、コマンドのマニュアルページを確認してください。以下にいくつかの例を示します。

  • _1_-一般的なエラーのキャッチオール

    「ゼロ除算」などのその他のエラーやその他の許可されない操作。

    例:

    _$ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    _
  • _2_-Shellビルトインの誤用(Bashのドキュメントによる)

    キーワードまたはコマンドが欠落している、または許可の問題(および失敗したバイナリファイル比較の戻りコードの差分)。

    例:

    _ empty_function() {}
    _
  • _6_-そのようなデバイスまたはアドレスはありません

    例:

    _$ curl foo; echo $?
    curl: (6) Could not resolve Host: foo
    6
    _
  • _124_-コマンドがタイムアウトしました

  • _125_-コマンド自体が失敗した場合参照: coreutils
  • _126_-コマンドが見つかったが、呼び出すことができない場合(例:実行不可)

    権限の問題またはコマンドは実行可能ではありません。

    例:

    _$ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    _
  • _127_-コマンドが見つからない場合、それを実行するために作成された子プロセスはそのステータスを返します

    _$PATH_またはタイプミスで起こりうる問題。

    例:

    _$ foo; echo $?
    -bash: foo: command not found
    127
    _
  • _128_-exitへの引数が無効です

    exitは、0〜255の範囲の整数の引数のみを受け取ります。

    例:

    _$ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    _
  • _128_-_254_-致命的なエラー信号 "n"-信号を受信したため、コマンドが終了しました。ステータスを取得するためにシグナルコードが128(128 + SIGNAL)に追加されます(Linux:_man 7 signal_、BSD:_man signal_)、以下のいくつかの例:

  • _130_-Ctrl-Cが押されたため、コマンドが終了しました。130-128= 2(SIGINT)

    例:

    _$ cat
    ^C
    $ echo $?
    130
    _
  • _137_-コマンドにKILL(9)信号(128 + 9)が送信された場合、それ以外の場合はコマンドの終了ステータス

    スクリプトの_kill -9 $PPID_。

  • _141_-SIGPIPE-リーダーなしでパイプに書き込む

    例:

    _$ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    _
  • _143_-信号コード15(128 + 15 = 143)で終了するコマンド

    例:

    _$ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    _
  • _255_ *-終了ステータスが範囲外です。

    exitは、0〜255の範囲の整数の引数のみを受け取ります。

    例:

    _$ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    _

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

範囲外の終了値は予期しない終了コードになる可能性があることに注意してください(たとえば、終了3809は225、3809%256 = 225の終了コードを示します)。

見る:

12
kenorb

コード/ドキュメントを調べる必要があります。ただし、「標準化」に最も近いものは errno.h です。

7
Thorsten Staerk

私の知る限りでは、標準値は2つ程度ですが、どちらもstdlib.hで定義されており、exit()で使用できます。

  • EXIT_SUCCESS(= 0)
  • EXIT_FAILURE(= 1)

そして、唯一の事実上の標準値、すなわち世界のすべてのプログラムに対して同じ意味を持つことは、成功を表す0(ゼロ)です。

さまざまなプログラムは、さまざまなエラー(さまざまなタイプまたは重大度)を区別または強調するために、返される「失敗」コードのさまざまなリストを導入します。一部のプログラムでは、返された値を使用して、検出されたランタイムエラーの整数を報告します(スーツの失敗した単体テストの数など)。

stdlib.hを拡張する「新しい標準」を導入することはお勧めしません

1
xoiss