Я создаю сценарий оболочки, который имеет такую 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
...
Я хочу, чтобы выполнение сценария завершилось после отображения сообщения об ошибке. Как я могу это сделать?
Если вы вставите
set -e
сценарий, он завершится, как только любая команда внутри него не удастся (т.е. как только любая команда вернет ненулевое состояние). Это не позволяет вам написать собственное сообщение, но часто бывает достаточно собственных сообщений неудачной команды.Преимущество этого подхода в том, что он автоматический: вы не рискуете забыть обработать случай ошибки.
Команды, статус которых проверяется условным выражением (например
if
,&&
или||
), не завершают сценарий (в противном случае условное выражение было бы бессмысленным). Идиома для случайных команд, сбой которых не имеет значенияcommand-that-may-fail || true
. Вы также можетеset -e
отключить часть скрипта с помощьюset +e
.источник
-x
флага с-e
флагом достаточно для отслеживания того, где ваша программа находится на выходе. Это означает, что пользователь сценария также является разработчиком.Если вы хотите иметь возможность обрабатывать ошибку вместо слепого выхода, вместо использования
set -e
используйте atrap
вERR
псевдосигнале.#!/bin/bash f () { errorCode=$? # 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 $errorCode # 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
или сбой или что-то в этом роде.источник
test
или&&
или||
.