Выход из сценария при ошибке
Я создаю сценарий оболочки, который имеет
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 *** ************ '