Обработка исключений в сценариях оболочки? - PullRequest
68 голосов
/ 05 августа 2011

Я ищу механизм обработки исключений в сценарии оболочки.Есть ли попытка поймать эквивалентный механизм в сценарии оболочки?

Ответы [ 5 ]

104 голосов
/ 05 августа 2011

В bash на самом деле нет try/catch (я предполагаю, что вы используете bash), но вы можете добиться довольно похожего поведения, используя && или ||.

В этом примеревы хотите запустить fallback_command, если a_command потерпит неудачу (возвращает ненулевое значение):

a_command || fallback_command

И в этом примере вы хотите выполнить second_command, если a_command успешно (возвращает 0):

a_command && second_command

Их можно легко смешать вместе с помощью подоболочки, например, следующая команда выполнит a_command, если это удастсязатем он запустит other_command, но если a_command или other_command не удастся, будет выполнено fallback_command:

(a_command && other_command) || fallback_command
11 голосов
/ 07 августа 2011

Структура if / else и коды выхода могут помочь вам подделать некоторые из них.Это должно работать в Bash или Bourne (sh).

if foo ; then
else
  e=$?        # return code from if
  if [ "${e}" -eq "1"]; then
    echo "Foo returned exit code 1"
  elif [ "${e}" -gt "1"]; then
    echo "Foo returned BAD exit code ${e}"
  fi
fi
4 голосов
/ 22 июня 2016
    {
        # command which may fail and give an error 
    } || {
       # command which should be run instead of the above failing      command
    }
3 голосов
/ 05 января 2014

Вот две простые функции bash, которые позволяют обрабатывать события в bash:

Вы можете использовать его для базовой обработки исключений, например так:

onFoo(){
  echo "onFoo() called width arg $1!"
}  

foo(){
  [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
} 

addListener EXCEPTION_FOO_OCCURED onFoo

Обработка исключений с помощью try / catchБлоки не поддерживаются в bash, однако, вы можете попробовать взглянуть на платформу BANGSH, которая ее поддерживает (это немного похоже на jquery для bash).

Однако , обработка исключений без каскадирования try /catch-blocks похож на обработка событий , что возможно возможно почти на любом языке с поддержкой массивов.

Если вы хотите, чтобы ваш код был красивым и аккуратным (без многословия if / else), я бы порекомендовал использовать события.

Предложение, которое рекомендует MatToufoutu (используя || и &&):не рекомендуется для функций, но нормально для простых команд .(см. BashPitfalls о рисках)

0 голосов
/ 16 июля 2019

Используйте следующее для правильной обработки ошибки, где error_exit - это функция, которая принимает один аргумент.Если аргумент не передан, он выдаст неизвестную ошибку с LineNo, где на самом деле происходит ошибка.Пожалуйста, поэкспериментируйте, прежде чем фактически использовать для производства -

#!/bin/bash

PROGNAME=$(basename $0)

error_exit()

{

    echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
    exit 1
}

echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...