Хотя это не совсем то же самое, поведение в стиле исключений можно до некоторой степени эмулировать в bash с помощью trap
.
Прежде чем вы попробуете это, лучше понять их по-настоящему, поэтому я настоятельно рекомендую вам руководство по Bash , в особенности концепцию кодов выхода , проверенную с помощью условных выражений .
Я обычно использую что-то вроде этого:
trap 'echo >&2 "ERROR in $BASH_SOURCE at line $LINENO, Aborting"; exit $LINENO;' ERR
ERR
(обычно без учета регистра) - это специальный триггер в bash, который вызывает любой код ловушки, установленный для него, всякий раз, когда из выполненной команды возвращается ошибка uncaught . Например:
$: trap 'echo OW' err
$: false
OW
false
всегда возвращает код выхода 1, поэтому он вызывает ловушку, если не пойман, например:
$: trap 'echo OW' err
$: false || echo nope
nope
||
упоминается вместе с &&
в нижней части ссылки на условные выражения, но в основном
&&
вычисляет его правое выражение, если левое выражение возвращает true
- 0
состояние выхода.
||
вычисляет его правое выражение, если левое выражение возвращает false
- ненулевое состояние выхода.
Либо из этих отлавливает (потребляет) ошибку, не давая ей активировать ловушку, как и большинство любых условных проверок состояния выхода.
Итак - предположим, файл xmp
с содержимым «Hello» и вышеуказанной ловушкой на месте.
$: echo Hello>xmp # create simple file
$: grep foo xmp # uncaught fail will trigger trap
OW
$: grep Hello xmp # success doesn't trigger trap
Hello
$: if grep foo xmp; then echo ok; else echo no; fi # caught exception doesn't trigger trap
no
$: grep Hello xmp && echo ok || echo no # success, no trigger
Hello
ok
$: grep foo xmp && echo ok || echo no # caught, no trigger
no
$: grep foo xmp || false # LHS caught, RHS triggers trap
OW
$: grep Hello xmp || false # LHS doesn't trigger RHS, no error, no trigger
Hello
$: grep foo xmp ||: # explicit ignore, : is an alieas for true
# WATCH OUT FOR THIS ONE -
$: grep foo xmp && echo ok # CHECKED, so *caught*
# note no trigger on the last one, because it was tested, even if not explicitly handled...
Это может или не может вам сильно помочь, но всегда приятно иметь постоянное поведение для любой необнаруженной ошибки, а затем явно обрабатывать все, что, как вы знаете, может дать сбой, но что вы можете исправить, или это не совсем вопрос.
Просто убедитесь, что вы понимаете, что он делает и как работает, чтобы вас это не удивляло. Всегда проверяйте, что он делает то, что вы ожидаете.