Выйти из 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
означает отказ или что-то в этом роде.