Выход из сценария при ошибке


Я создаю сценарий оболочки, который имеет

5 90

5 ответов:

ищите exit?

Это лучший Баш руководство вокруг. 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

...

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

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

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

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

вот так:

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

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