2016-12-22 3 views
3

Чтобы проверить код завершения команды в Bash используется следующая логика:Как создать эффективную проверку ошибок в скрипте Bash?

if [ $? -ne 0 ] 
then 
    echo "Error occurred" 
    return 1 
fi 

Моя проблема заключается в том, что при добавлении этого после каждой команды делает сценарий очень долго с несколькими копиями одного и того же, и очень трудно поддерживать.

Лучшая вещь здесь будет функцией, которая будет вызываться из всех мест, где необходимо проверить код выхода. Проблема в том, что команда exit не может быть использована, поскольку она убьет текущий процесс (текущий сеанс Bash будет убит), поэтому может использоваться только команда return. Но при использовании команды return в вызываемой функции вызывающая функция все равно должна проверять код выхода и вернуться к той же проблеме.

Есть ли что-то вроде MACRO в Bash или любым другим способом проверки ошибок более эффективно?

+0

Как насчет 'set -e'? – Biffen

+0

Он убьет текущий процесс, и это не обязательное поведение. –

ответ

1

Вместо этого:

somecommand 
if [ $? -ne 0 ] 
then 
    echo "Error occurred" 
    return 1 
fi 

Вам не нужно писать условия на переменную $?, вы можете использовать саму команду в if заявления:

if ! somecommand 
then 
    echo "Error occurred" 
    return 1 
fi 

Другой альтернативой является создание вспомогательной функции для инкапсуляции действия при ошибке и использование || Оператор после команды для вызова функции, а затем return 1 после:

error() { 
    echo "Error occurred" 
} 

somecommand || { error; return 1; } 

Наконец, если вы на самом деле не нужно return 1, и вы не возражаете, чтобы выйти из сценария в случае выхода из строя, то вы можете exit 1 внутри вспомогательная функция, а затем код вызывающего абонента может стать более компактным:

fatal() { 
    echo "Error occurred" 
    exit 1 
} 

somecommand || fatal 
+0

Спасибо! оператор || выбор выглядит хорошо, одна строка вместо 4 каждый раз –

+0

вы правы :) –

+0

@ A.David спасибо, но если я прав, они почему вы все еще не отметили это принятым ответом? – janos

Смежные вопросы