回答:
特定の端末コマンドの終了ステータスの意味を取得するための「レシピ」はありません。
私の最初の試みはマンページです:
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).
3番目:シェルの終了ステータス(bashなど)。Bashとそのビルトインでは、125を超える値を特別に使用できます。コマンドが見つからない場合は127、コマンドが実行できない場合は126。詳細については、bash終了コードを参照してください。
終了コードは、プログラムの終了時の障害状態を示し、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 sysexits
BSDの場合)にあります。
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
-コマンド自体が失敗した場合:coreutils126
-コマンドは見つかったが起動できない場合(例:実行不可)
権限の問題またはコマンドは実行可能ファイルではありません。
例:
$ /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からのものであり、他のほとんどの人によって使用されていません。それらは標準に近いものではありません。
コード/ドキュメントを確認する必要があります。ただし、「標準化」に最も近いものはerrno.hです。
errno.h
終了コードに関しては問題ではなく、エラーメッセージのみです。
sysexits.h
。ただし、一部のプログラムはerrno
sを返すため、実際にerrno
sを返すのが最も理にかなっていると思います。未処理errno
のsは、例外のように上方に伝播します(errno
滞在、関数は、例えば、-1
またはを返します0|NULL
)。プログラムは単なる関数であるため、関数は別のアドレス空間で実行されますが、プログラムがerrno
プロセスの境界を越えて伝播を継続することを望むのは理にかなっています。
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
。
私の知る限り、標準値は多かれ少なかれ2つしかなく、どちらもstdlib.h
exit()で使用するために定義されています。
そして、唯一の事実上の標準値、つまり、世界中のすべてのプログラムで同じ意味を持つものは、SUCCESSを表す0(ゼロ)です。
異なるプログラムは、返される「失敗」コードの異なるリストを導入して、異なるエラー(異なるタイプまたは重大度)を区別または強調します。一部のプログラムでは、返された値を使用して、検出されたランタイムエラーの整数数(スーツ内の失敗した単体テストの数など)を報告します。
あらゆる種類の「新しい標準」を導入することはお勧めしません stdlib.h