Как сделать утверждение внутри функции bash независимо от проверки логики?

Как сделать утверждение внутри функции bash независимо от проверки логики?

Я хотел бы реализовать глобальную ловушку для моего скрипта bash, которая срабатывает, когда что-то не получается. Проблема в том, что если у меня есть предложение if, которое оценивает функцию, которая является предикатом, и при оценке этого предиката происходит сбой, то ловушка не вызывается. Я понимаю, что ловушки не вызываются, если предикат возвращает false, но я не ожидал, что логика, вычисляющая предикат, также отключит ловушку. Правильно ли я понимаю поведение, и есть ли способ заставить bash вызвать ловушку при логике, вычисляющей предикат?

Например,

$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1

Пока все хорошо. Я определяю ловушку, прошу, чтобы любой сбой вызывал ловушку, и прошу, чтобы все функции наследовали ловушку. Затем я вызываю barwhich foo, который вызывает сбой, вызывает ловушку и печатает код ошибки 1.

$ if bar; then echo true; fi
true

Это неожиданно. Я ожидал, что вывод будет 1. Я ожидал, что только код возврата из barбудет исключен из рассмотрения. Что на самом деле происходит, я думаю, так это то, что вся логика внутри bar— этотакжеисключено из рассмотрения. Это просто так работает bash? Есть ли способ указать, что любая логика, которая barдает сбой (например, вызов foo), перед последним оператором (например, return 0;), должна вызывать ловушку?

Связанный контент