これは学術的な練習に近いですが、答えが気になります。現在問題があるコードは次のとおりです。
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つの問題があります。
- サブシェルから元の関数を呼び出そうとしています(bashにパイピングする)が、サブシェルではなく現在のシェルから呼び出す方が良いでしょう。
- 元の関数が文字列で必要に応じて解釈されないため、機能しません。
答え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にはいくつかの特別な場合に関数定義が正しく表示されないようにするいくつかのバグがあることに注意してください。理論的にはzsh
sでも同じことが起こります$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に表示しました。。