`funcstack`を拡張する方法は?

`funcstack`を拡張する方法は?

set -e組み込み関数1を使用すると、エラーが原因でシェルが終了するため、良い考えではありません。

したがって、シェル関数ではたくさん私のコードは次のとおりです

[[ -e $file ]] || {
    printf -- 'foo: %s does not exist\n' $file >&2
    return -1
}

...これは逮捕するだけでなく最高レベルですfuncstackerror少なくとも上記のコードを次のように圧縮できる関数があれば良いでしょう。

[[ -e $file ]] || error -1 '%s does not exist' $file

次のエラー関数を作成して使用してください。説明した関数と反対のスクリプトはそれほど難しくありません。

error () {
    local exitstatus=$1
    shift

    {
        printf -- '%s: ' "${funcstack[2]}"
        printf -- "$@"
        printf -- '\n'

    } >&2

    exit $exitstatus
}

...しかし、他の関数の中でこの関数を呼び出すのは悪い考えであり、同じ理由で関数の内部set -eでも悪い考えです。

必要な機能を達成するために必要なのは、error呼び出しシェルの「最上位レベル」に制御を戻す方法です(したがって、funcstack呼び出し時にランダムに長くなる可能性を消去する方法error)。

これを行う方法はありますか?


PS:もちろん、私は次のような素朴なアプローチを試しました。

error () {
    local exitstatus=$1
    shift

    {
        printf -- '%s: ' "${funcstack[2]}"
        printf -- "$@"
        printf -- '\n'
    } >&2

    funcstack=()
}

...しかし(驚くべきことではありません)、次のzshいずれもありません。

error:10: read-only variable: funcstack

1この記事では、「対話型を使用するためのシェル関数内で、またはソースをインポートするためのスクリプト内で」を減らし、「関数内で」などの表現を使用します。

関連情報