bashスクリプトの最後の終了コード


22

bashスクリプトの最後にある終了コードの意味について混乱しています:終了コード0は正常に終了したことを意味し、終了コード番号(もっと間違えなければ127)があることを知っています。

私の質問は、スクリプトの最後に終了コード0が表示される場合、スクリプトが失敗した場合や別の意味がある場合でも、終了コードを強制的に0に設定することです。


2
スクリプトがで終わる場合、スクリプトexit 0内で何が起こっても、終了コード0で終了します。
ハットクロック

@Hatclockなぜあなたはあなたの答えを完全な約束の答えを投稿しなかったのですか?コメントとして私はそれをマークカント、と私はあなたが答えるために偽のインターネットポイントを得るとは思わないだけの思考を...(高速応答のための名声)(右?)
バステッド

1
私は自分の携帯電話で駅にいます。携帯電話であまりタイプするのはあまり好きではありません。ilkkachuは良い答えを持っているようです!
ハットクロック


2
@Hatclockいいえ、まったくありません。スクリプトがで終わるexit 0場合、最後の命令が実行された場合にのみ、コード0で終了します。exit 0スクリプトの最後の唯一の影響は、前の命令のステータスの代わりに0を返すことです。
ジル「SO-悪であるのをやめる」

回答:


22

組み込みコマンドexitはシェルを終了します(Bashのリファレンスから):

exit [n]
シェルを終了し、nのステータスをシェルの親に返します。nを省略すると、終了ステータスは最後に実行されたコマンドの終了ステータスになります。シェルの終了前に、EXITのトラップが実行されます。

ファイルの最後まで実行すると終了し、最後のコマンドの戻りコードが返されます。そのため、最後のコマンドexit 0は、前のコマンドの終了ステータスに関係なく、スクリプトを成功ステータスで終了させます。(つまり、スクリプトがfinalに到達すると仮定しますexit。)スクリプトの終わりに、trueまたは:を使用して、ゼロの終了コードを取得することもできます。

もちろん、スクリプトを途中で終了exitするifために、より多くの場合、内部から使用します。

これらは1($?前のコマンドで返された終了コードを含む)を出力するはずです:

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

これは0を出力するはずです:

sh -c "false; exit 0" ; echo $?

exitスクリプトによって実行された一部のコマンドが失敗する可能性がありますが、スクリプト自体は成功する可能性があるため、スクリプトの実行時にスクリプトが「失敗する」という概念が意味をなすかどうかはわかりません。何が成功で何がそうでないかを決定するのは、スクリプトの作成者次第です。

また、終了コードの標準範囲は0..255です。127を超えるコードは、シグナルによって終了したプロセスを示すためにシェルによって使用されますが、通常の方法で返すことができます。waitシステムコールは、実際のオペレーティングシステムによって設定されたステータス・ビットを含む残りの、より広い値を返します。


クール、8ビットの終了コードの番号付けについては知りませんでした。ありがとう!
バスト

プロセスが強制終了されても、終了コード> 127で終了しないことに注意してください。その場合、一部のシェル$?は128 + signumに設定されているだけです。プロセスが終了したときのデフォルトの終了コードを参照してください詳細については。
ステファンシャゼラス

exit 0出口が実行された場合にのみ0を返します。(別のルートで終了する可能性があります)。
ctrl-alt-delor

18

0は成功を意味し、正の整数は失敗を意味します。255個のエラーコードがありますが、値126以上は、プログラムが起動できなかった(126または127)か、シグナルによって強制終了されたこと(129以上)を示すために予約されています。プロセスが終了したときのデフォルトの終了コードを参照してくださいおよびbash関数/スクリプトで使用できる戻り値/終了値は何ですか?詳細については。

シェルスクリプトの終了ステータスは、スクリプトが実行した最後のコマンドの終了ステータスです。例えば

#!/bin/sh
somecommand

の終了ステータスを返しますがsomecommand

#!/bin/sh
somecommand
exit 0

返されたものsomecommandに関係なく0を返します。この2番目のスクリプトも記述できます

#!/bin/sh
somecommand
true

置くexit 0スクリプトの終わりにしても、必ずしもそれはこれが唯一のスクリプトの最後に達した場合には0を返します0を返すことはありません。たとえば、次のスクリプトは常に3を返します。

#!/bin/sh
exit 3
exit 0

次のスクリプトは、構文エラーに関するメッセージの表示に加えて、常にエラーコードも返します。

#!/bin/sh
}
exit 0

次のスクリプトは、最初の引数に応じて1または0を返します。

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

次のスクリプトは、失敗した場合にスクリプトを終了させるsomecommandため、ステータスを返します。set -esomecommand

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