这更像是一项学术练习,但对答案感到好奇。这是当前有问题的代码:
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 函数,然后从覆盖中调用原始函数。
这段代码有两个问题:
- 我试图从子 shell 调用原始函数(管道到 bash),但最好从当前 shell 而不是子 shell 调用。
- 它不起作用,因为原始函数没有按照字符串中的要求进行解释。
答案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)"
(但要注意 bash 有几个错误,typeset -f
在某些极端情况下无法正确显示函数定义;理论上,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
)
现在,这意味着您不能多次执行此操作,否则您需要每次为保存的原始处理程序选择不同的名称。相反,您可以将原始函数的代码嵌入到自定义函数中,如下所示我在问答中表明这是后续行动。