関数にエイリアスを追加し、元の名前の関数から呼び出す方法

関数にエイリアスを追加し、元の名前の関数から呼び出す方法

これは学術的な練習に近いですが、答えが気になります。現在問題があるコードは次のとおりです。

export original_command_not_found_handler="$(type -f command_not_found_handler)" # original func as string

function command_not_found_handler(){  # my custom override
  echo "my custom handler: $@"
  echo "
     ${original_command_not_found_handler}
      command_not_found_handler "$@"
  " | bash

}

私が望むのは、元のzsh関数を自分のカスタム関数で上書きし、オーバーレイから元の関数を呼び出すことです。

このコードには2つの問題があります。

  1. サブシェルから元の関数を呼び出そうとしています(bashにパイピングする)が、サブシェルではなく現在のシェルから呼び出す方が良いでしょう。
  2. 元の関数が文字列で必要に応じて解釈されないため、機能しません。

答え1

では、zsh関数とその定義が特殊な$functions連想配列に公開されるので、関数のコピーを作成するには、次のようにします。

functions[original_command_not_found_handler]=$functions[command_not_found_handler]

では、bash次のことができます。

eval "original_command_not_found_handle()
$(typeset -f command_not_found_handle | tail -n +2)"

typeset -f(しかし、bashにはいくつかの特別な場合に関数定義が正しく表示されないようにするいくつかのバグがあることに注意してください。理論的にはzshsでも同じことが起こります$functions

次に、両方で次のことを行います。

command_not_found_handler() {
  echo my custom handler
  if was handled by my custom handler; then
    return "$some_ret_code"
  fi
  original_command_not_found_handler "$@"
}

(Bashではにhandler交換handle

これは、これを何度も実行できないことを意味します。それ以外の場合は、保存された元のハンドラごとに別の名前を選択する必要があります。代わりに、次のように元の関数のコードをカスタム関数に含めることができます。フォローアップとQ&Aに表示しました。

関連情報