Bash
如何給函式起別名並從具有原始名稱的函式呼叫
這更像是一項學術練習,但對答案感到好奇。這是目前有問題的程式碼:
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
特殊的關聯數組中,所以要複製一個函式,你只需: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
)現在,這意味著您不能多次這樣做,或者您每次都需要為保存的原始處理程序選擇一個不同的名稱。相反,您可以將原始函式的程式碼嵌入到您的自定義函式中,正如我在問答中展示的那樣,這是對.