Выйти из Script On Error

Я создаю оболочку Script, которая имеет функцию 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

...

Я хочу, чтобы выполнение Script закончилось после отображения сообщения об ошибке. Как я могу это сделать?

Ответ 1

Вы ищете 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

...

Ответ 2

Если вы помещаете set -e в script, script завершается, как только всякая команда внутри него терпит неудачу (т.е. как только любая команда возвращает ненулевой статус). Это не позволяет вам писать собственное сообщение, но часто достаточно сообщений о неудачной команде.

Преимущество такого подхода заключается в том, что оно автоматическое: вы не рискуете забыть об ошибке с ошибкой.

Команды, состояние которых проверяется условным (например, if, && или ||), не завершают script (иначе условное было бы бессмысленным). Идиома для случайной команды, чей отказ не имеет значения, command-that-may-fail || true. Вы также можете отключить set -e для части script с помощью set +e.

Ответ 3

Если вы хотите иметь возможность обрабатывать ошибку вместо слепого выхода, вместо использования 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.

Ответ 4

Вот как это сделать:

#!/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 *** 
************
'

Ответ 5

exit 1 - это все, что вам нужно. 1 - это код возврата, поэтому вы можете изменить его, если хотите, например, 1 означать успешный прогон, а -1 означает отказ или что-то в этом роде.