Я ищу механизм обработки исключений в оболочке 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."