bashスクリプトの最後の終了コードの意味について混乱しています:その終了コードを知っています0は、正常に終了したことを意味し、終了コード番号がもっとたくさんあることを意味します(私が間違っていない場合は127ですか?)
私の質問は、スクリプトの最後に終了コード0が表示されるときについてです。スクリプトが失敗した場合でも、終了コードを強制的に0にしますか、それとも別の意味がありますか?
コメント
- スクリプトが
、スクリプト内で何が起こったかに関係なく、終了コード0で終了します。
exit 0
で終わる場合、その最後の命令が実行された場合にのみ、コード0で終了します。スクリプトの最後にあるexit 0
の唯一の影響は、前の命令のステータスではなく0を返すことです。exit 0
を実行すると、それ以前に何が起こったかに関係なく、終了コード0が返されます。回答
組み込みコマンドexit
がシェルを終了します( Bashから)参照):
exit [n]
シェルを終了し、ステータスnを返しますシェルの親に。nを省略すると、終了ステータスは最後に実行されたコマンドのステータスになります。EXITのトラップは、シェルが終了する前に実行されます。
ファイルの最後まで実行すると終了し、最後のコマンドの戻りコードが返されるため、はい、最後のexit 0
は、の終了ステータスに関係なく、スクリプトを正常なステータスで終了します。前のコマンド(つまり、スクリプトが最後のexit
に到達したと仮定します。)スクリプトの最後で、true
を使用することもできます。またはで終了コードをゼロにします。
もちろん、iv id =”の内部からexit
を使用することがよくあります。 b24dfb915f “>
でスクリプトを途中で終了します。
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、終了が実行された場合。 (別のルートで終了する可能性があります。)
回答
0は成功を意味し、正の整数は失敗を意味します。 255の異なるエラーコードがありますが、値126以上は、プログラムを開始できなかった(126または127)か、シグナルによって強制終了された(129以上)ことを示すために予約されています。プロセスが終了したときのデフォルトの終了コード?および詳細については、bash関数/スクリプトで使用できる戻り/終了値を教えてください。
シェルスクリプトの終了ステータスは、スクリプトが最後に実行したコマンドの終了ステータスです。たとえば、
#!/bin/sh somecommand
はsomecommand
の終了ステータス、
#!/bin/sh somecommand exit 0
は、somecommand
が返されました。この2番目のスクリプトも記述できます
#!/bin/sh somecommand true
スクリプトの最後にexit 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
次のスクリプトは、iv id = “6c673f16d7″であるため、somecommand
のステータスを返します。 >
は、somecommand
が失敗した場合にスクリプトを終了させます:
#!/bin/sh set -e somecommand exit 0