Bash関数デコレータ

Bash関数デコレータ

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'

おすすめ記事