Bash 스크립트에서 EXIT 및 ERR 트랩의 올바른 사용

Bash 스크립트에서 EXIT 및 ERR 트랩의 올바른 사용

나는 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."
}

그러나 errexit와 함께 반환 코드를 0으로 설정하면 EXIT 신호가 트리거되고, 이는 내 종료 트랩에 의해 포착됩니다. ERR에 수동으로 신호를 보낼 수 있는지 알아보기 시작했지만 아직 답변을 찾지 못했고 이를 올바르게 처리하고 있는지 궁금해지기 시작했습니다.

관련 정보