这更像是一项学术练习,但对答案感到好奇。这是当前有问题的代码:
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调用。
- 它不起作用,因为原始函数没有在字符串中按需要进行解释。
在
zsh
, 函数和它们的定义暴露在$functions
特殊的关联数组中,所以要复制一个函数,你只需:在
bash
中,您可以执行以下操作:(但要注意 bash 有几个错误,
typeset -f
在某些极端情况下没有正确显示函数定义;理论上,同样的情况也可能发生在zsh
's上$functions
)然后在两者中,你都这样做:
(在 bash 中,替换
handler
为handle
)现在,这意味着您不能多次这样做,或者您每次都需要为保存的原始处理程序选择一个不同的名称。相反,您可以将原始函数的代码嵌入到您的自定义函数中,正如我在问答中展示的那样,这是对.