Обработка исключений в сценариях оболочки?

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

Ответ 1

В 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

Ответ 2

Коды 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

Ответ 3

    {
        # command which may fail and give an error 
    } || {
       # command which should be run instead of the above failing      command
    }

Ответ 4

Вот две простые bashfunctions, которые позволяют обрабатывать события в 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-блоков аналогична обработке событий, которая возможна почти в любом strong > язык с поддержкой массива.

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

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

Ответ 5

Используйте следующее для правильной обработки ошибки, где 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."