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に手動で信号を送信できるかどうかを調べ始めましたが、まだ答えが見つからず、それを正しく処理しているかどうか疑問になり始めました。

ベストアンサー1

おすすめ記事