web-dev-qa-db-ja.com

エラー時にスクリプトを終了する

このようなif関数を持つシェルスクリプトを作成しています。

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi

...

エラーメッセージを表示した後、スクリプトの実行を終了する必要があります。どうすればいいですか?

121
Nathan Campos

exit をお探しですか?

これは最高のbashガイドです。 http://tldp.org/LDP/abs/html/

コンテキスト内:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
    exit 1 # terminate and indicate error
fi

...
114
Byron Whitlock

スクリプトにset -eを指定すると、スクリプトはその中のコマンドが失敗するとすぐに(つまり、コマンドがゼロ以外のステータスを返すとすぐに)終了します。これはあなた自身のメッセージを書くことを許しませんが、しばしば失敗したコマンド自身のメッセージで十分です。

このアプローチの利点は、自動であるということです。エラーのケースに対処するのを忘れる危険を冒さないでください。

状態によって条件がテストされるコマンド(if&&||など)は、スクリプトを終了しません(そうでなければ、条件は無意味になります)。失敗が問題にならないときどきコマンドのイディオムはcommand-that-may-fail || trueです。 set -eを使用して、スクリプトの一部でset +eをオフにすることもできます。

316
Gilles

set -eを使用する代わりに、盲目的に終了する代わりにエラーを処理できるようにするには、trap疑似信号でERRを使用します。

#!/bin/bash
f () {
    errcode=$? # save the exit code as the first thing done in the trap function
    echo "error $errorcode"
    echo "the command executing at the time of the error was"
    echo "$BASH_COMMAND"
    echo "on line ${BASH_LINENO[0]}"
    # do some error handling, cleanup, logging, notification
    # $BASH_COMMAND contains the command that was being executed at the time of the trap
    # ${BASH_LINENO[0]} contains the line number in the script of that command
    # exit the script or return to try again, etc.
    exit $errcode  # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff

他のトラップは、通常のUnixシグナルに加えて、他のBash疑似シグナルRETURNおよびDEBUGを含む、他のシグナルを処理するように設定できます。

39

これを行う方法は次のとおりです。

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'
8
supercobra