如何为函数添加别名并从具有原始名称的函数中调用

如何为函数添加别名并从具有原始名称的函数中调用

这更像是一项学术练习,但对答案感到好奇。这是当前有问题的代码:

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 函数,然后从覆盖中调用原始函数。

这段代码有两个问题:

  1. 我试图从子 shell 调用原始函数(管道到 bash),但最好从当前 shell 而不是子 shell 调用。
  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)"

(但要注意 bash 有几个错误,typeset -f在某些极端情况下无法正确显示函数定义;理论上,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 中,替换handlerhandle

现在,这意味着您不能多次执行此操作,否则您需要每次为保存的原始处理程序选择不同的名称。相反,您可以将原始函数的代码嵌入到自定义函数中,如下所示我在问答中表明这是后续行动

相关内容