Правильное использование ловушек EXIT & ERR в сценариях bash

Я работаю над сценарием bash, и по мере того, как я шел, я узнал о ловушках, сигналах, кодах возврата функций и других таких функциях, которые я ранее не использовал.

Возможно, я неправильно думаю о вещах – я ищу совет.

Я устанавливаю следующие параметры:

set -o errexit set -o nounset set -o noclobber 

В моем сценарии bash у меня есть следующие ловушки выхода и ошибки:

 # Error handler. This function is called anytime an ERR signal is received. # This function should never be explictly called. function _trap_error () { if [ ! -v _VERBOSE ]; then echo "An error has occurred. Exiting." else _name="$0" # name of the script _lastline="$1" # argument 1: last line of error occurence _lasterr="$2" # argument 2: error code of last command echo "${_name}: line ${_lastline}: exit status of last command: ${_lasterr}" exit 1 fi } trap '_trap_error ${LINENO} ${$?}' ERR # Exit handler. This function is called anytime an EXIT signal is received. # This function should never be explicitly called. function _trap_exit () { [ -v _POPD ] && popd &> /dev/null } trap _trap_exit EXIT 

Они работают так, как я ожидал. Вместо того, чтобы вставлять проверку ошибок во все мои функции, я пытаюсь использовать ловушки для обработки этого для меня, например, при проверке наличия файла. Если указанный модуль не может быть загружен, я хотел бы поймать его как ошибку, отобразить сообщение об ошибке и выйти.

 function _module_path () { echo "mod.d/$2s/$1/__init__.sh" } function _module_exists () { [ -f $(_module_path $1 $2) ] && return 0 || return 1 } function _module_push () { _module_exists $1 $2 && _MODULES+=$( _module_path $1 $2 ) || msg "Module $1 does not exist." } 

Тем не менее, установка кода возврата в 0 вместе с errexit вызывает сигнал EXIT, который попадает на мою выходную ловушку. Я начал пытаться выяснить, могу ли я вручную исправить сигнал ERR, но не нашел ответа и начал задаваться вопросом, правильно ли я это сделаю.