set -e
組み込み関数1を使用すると、エラーが原因でシェルが終了するため、良い考えではありません。
したがって、シェル関数ではたくさん私のコードは次のとおりです
[[ -e $file ]] || {
printf -- 'foo: %s does not exist\n' $file >&2
return -1
}
...これは逮捕するだけでなく最高レベルですfuncstack
。error
少なくとも上記のコードを次のように圧縮できる関数があれば良いでしょう。
[[ -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この記事では、「対話型を使用するためのシェル関数内で、またはソースをインポートするためのスクリプト内で」を減らし、「関数内で」などの表現を使用します。