Я хотел бы реализовать глобальную ловушку для моего скрипта bash, которая срабатывает, когда что-то не получается. Проблема в том, что если у меня есть предложение if, которое оценивает функцию, которая является предикатом, и при оценке этого предиката происходит сбой, то ловушка не вызывается. Я понимаю, что ловушки не вызываются, если предикат возвращает false, но я не ожидал, что логика, вычисляющая предикат, также отключит ловушку. Правильно ли я понимаю поведение, и есть ли способ заставить bash вызвать ловушку при логике, вычисляющей предикат?
Например,
$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1
Пока все хорошо. Я определяю ловушку, прошу, чтобы любой сбой вызывал ловушку, и прошу, чтобы все функции наследовали ловушку. Затем я вызываю bar
which foo
, который вызывает сбой, вызывает ловушку и печатает код ошибки 1
.
$ if bar; then echo true; fi
true
Это неожиданно. Я ожидал, что вывод будет 1
. Я ожидал, что только код возврата из bar
будет исключен из рассмотрения. Что на самом деле происходит, я думаю, так это то, что вся логика внутри bar
— этотакжеисключено из рассмотрения. Это просто так работает bash? Есть ли способ указать, что любая логика, которая bar
дает сбой (например, вызов foo
), перед последним оператором (например, return 0;
), должна вызывать ловушку?