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


17

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

回答:


15

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

私の最初の試みはマンページです:

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).

第二グーグル。例としてwgetを参照してください。

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


ええ、いくつかの男、情報、...ページにはそれらが含まれています..そして私はそうしなかった人々に関心がありました。..そして、私はウェブ調査が常にオプションであることを知っています。..今のところ、それは私が探していたbashの終了コードだけだったようだ..
正確に14年

12

終了コードは、プログラムの終了時の障害状態を示し、0〜255になります。シェルとそのビルトインは、特に125を超える値を使用して特定の障害モードを示すため、コードのリストはシェルとオペレーティングシステム(Bash終了ステータスとして値128 + Nを使用します)。参照:Bash-3.7.5終了ステータスまたはman bash

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

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

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

LinuxおよびBSD / OS Xの両方でのsysexitsのリストと、プログラム(64-78)に適した終了コードは、/usr/include/sysexits.h(またはman sysexitsBSDの場合)にあります。

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 -シェルビルトインの誤用(Bashドキュメントによる)

    キーワードまたはコマンドの欠落、または許可の問題(およびバイナリファイルの比較に失敗した場合のdiffリターンコード)。

    例:

     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の終了コードになります)。

見る:


errno値はシステムAPIによって使用され、終了ステータスとしては使用されず(適切な範囲内でもない)、シェルスクリプトには関係ありません。Sysexitsの値はsendmailからのものであり、他のほとんどの人によって使用されていません。それらは標準に近いものではありません。
ジル「SO-悪であるのをやめる」

7

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


終了コードを見つけるいくつかのutilsのの文書化を検討してみましたヘッダファイルを指してくれてありがとう.. ..苦労は、...ほとんどがstderrsになりそうです
正確に

3
errno.h終了コードに関しては問題ではなく、エラーメッセージのみです。
ジル「SO-悪であるのをやめる」14年

ほとんどのプログラムは、BSD規約に従って終了コードを返しますsysexits.h。ただし、一部のプログラムはerrnosを返すため、実際にerrnosを返すのが最も理にかなっていると思います。未処理errnoのsは、例外のように上方に伝播します(errno滞在、関数は、例えば、-1またはを返します0|NULL)。プログラムは単なる関数であるため、関数は別のアドレス空間で実行されますが、プログラムがerrnoプロセスの境界を越えて伝播を継続することを望むのは理にかなっています。
PSkocik

@PSkocik、そのようなコマンドの例はありますか?errnoは移植性がなく(システム間で値が一貫していない)、値からerr名またはメッセージを取得する移植性のある方法はありません(zshにはそのための組み込み機能があります)。一部のシステムでは、123を超えるerrnoがあり、一般的な特別な意味のエラーコードと衝突することは言うまでもありません。通常、コマンドはerrnoからメッセージを出力し、成功/失敗の終了ステータスを返します。コマンドはユーザー向けです。関数/システムコールはプログラマを対象としています。
ステファンシャゼラス

@StéphaneChazelas私はそれを数回見ましたが、確立されたどのプログラムでもそうではないことを認めなければなりません。プログラムの実行はBSD規則に従って翻訳するよりもプロセス境界を越えてerrnoをシリアル化する方が理にかなっていると思うので、最近個人的におもちゃシステムでerrno + 1を返しています(1は「エラー」を意味し続けます)基本的に関数呼び出しであり、関数はerrnoを使用します。PROMPT_COMMAND(bash)で独自の最終終了ステータスデコーダーを使用しているため、次のような結果が得られます"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
PSkocik

1

私の知る限り、標準値は多かれ少なかれ2つしかなく、どちらもstdlib.hexit()で使用するために定義されています。

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

そして、唯一の事実上の標準値、つまり、世界中のすべてのプログラムで同じ意味を持つものは、SUCCESSを表す0(ゼロ)です。

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

あらゆる種類の「新しい標準」を導入することはお勧めしません stdlib.h

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.