Определите reproduce
следующим образом, и он будет вести себя так, как вы ожидали.
function reproduce() (
# Trigger arithmetic error on purpose
a=$((1109962735 - hello=12272 + 1))
)
Таким образом, ошибка раскрытия будет происходить в подоболочке и вызывать ее выход с ненулевым статусом, таким образом, errexit и trap смогут его перехватить.
Когда вы определите его с помощью фигурных скобок, он будет выполнен в текущей среде выполнения, а синтаксическая ошибка или ошибка расширения предотвратит его завершение;т.е. сдача статуса выхода. Когда это происходит, bash назначит ненулевое значение для $?
и продолжит работу, поэтому механизм errexit и ловушка ERR не сработают.
Обычно оболочка POSIX, работающая неинтерактивно, немедленно выходит из системы. из-за ошибки синтаксиса или расширения, но bash этого не делает (если не установлена опция posix
), и это является следствием.
По запросу dash-o вот версия, которая устанавливает a
для текущей среды выполнения, когда выражение допустимо:
function reproduce() {
(: $((expression))) && a=$((expression))
}