Bash

如何給函式起別名並從具有原始名稱的函式呼叫

  • February 21, 2022

這更像是一項學術練習,但對答案感到好奇。這是目前有問題的程式碼:

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. 它不起作用,因為原始函式沒有在字元串中按需要進行解釋。

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 中,替換handlerhandle

現在,這意味著您不能多次這樣做,或者您每次都需要為保存的原始處理程序選擇一個不同的名稱。相反,您可以將原始函式的程式碼嵌入到您的自定義函式中,正如我在問答中展示的那樣,這是對.

引用自:https://unix.stackexchange.com/questions/691509