Выход из сценария при ошибке - PullRequest
116 голосов
/ 08 декабря 2010

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

...

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

Ответы [ 5 ]

313 голосов
/ 08 декабря 2010

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

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

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

110 голосов
/ 08 декабря 2010

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

...
38 голосов
/ 08 декабря 2010

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

8 голосов
/ 05 марта 2014

Вот способ сделать это:

#!/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 *** 
************
'
0 голосов
/ 08 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...