Pythonでは、関数を自動的に適用して実行するコードで関数を飾ることができます。
Bashにも同様の機能がありますか?
現在作業しているスクリプトには必須パラメータをテストし、そのパラメータがない場合は終了し、デバッグフラグが指定されているといくつかのメッセージを表示する定型句があります。
残念ながら、このコードをすべての関数に再挿入する必要があり、コードを変更するにはすべての関数を変更する必要があります。
Pythonのデコレータと同様に、各関数からこのコードを削除してすべての関数に適用する方法はありますか?
ベストアンサー1
zsh
匿名関数と関数コードを持つ特別な連想配列があれば、はるかに簡単になります。しかし、bash
次のようにすることができます。
decorate() {
eval "
_inner_$(typeset -f "$1")
$1"'() {
echo >&2 "Calling function '"$1"' with $# arguments"
_inner_'"$1"' "$@"
local ret=$?
echo >&2 "Function '"$1"' returned with exit status $ret"
return "$ret"
}'
}
f() {
echo test
return 12
}
decorate f
f a b
すると、以下が出力されます。
Calling function f with 2 arguments
test
Function f returned with exit status 12
ただし、デコレータを2回呼び出すことで関数を2回飾ることはできません。
そしてzsh
:
decorate()
functions[$1]='
echo >&2 "Calling function '$1' with $# arguments"
() { '$functions[$1]'; } "$@"
local ret=$?
echo >&2 "function '$1' returned with status $ret"
return $ret'