zsh:source
命令不會重新載入函式
(這是在帶有 zsh 5.7.1 的 MacOS 上)
這是我在 zsh 中載入自定義函式的方式:
# Custom functions fpath=($HOME/.zfunc $fpath) autoload -Uz mackupbackup autoload -Uz tac autoload -Uz airplane autoload -Uz wakeMyDesktop
每個函式都是目錄中自己的文件
~/.zfunc
。請注意,由於mackup
.我編寫了一個新函式來將目前送出雜湊複製到剪貼板。我在 $fpath 中創建了一個名為 的文件
ghash
,編寫了函式,autoload
在 my 中添加了一個新行.zshrc
並執行了source ~/.zshrc
.這是功能
# copy the commit hash of the given git reference, or HEAD if none is given ref=$1 if [[ $ref ]]; then git rev-parse $1 | pbcopy else git rev-parse HEAD | pbcopy fi
在 sourcing 之後
.zshrc
,該功能變得可用並且有效,但我想添加一行來列印確認它有效:echo "Copied $(pbpaste) to clipboard"
所以我添加了那行,保存了文件,然後我再次採購
.zshrc
。我再次執行該函式,但它的行為沒有改變!
我以為我做錯了什麼,所以我一直在更改功能和採購
.zshrc
,但沒有效果。總而言之,我重新採購.zshrc
了 22 次,到那時該操作需要 37 秒才能完成……然後我意識到它可能沒有重新載入函式,所以我跑來
zsh
啟動一個新實例(大約需要 1 秒),函式開始按預期工作!任何人都知道為什麼
source
拿起我的新功能,但在功能改變時沒有更新它?額外的問題:為什麼
source ~/.zshrc
每次我執行它都需要更長的時間?
在實踐中很少使用 rc 文件,因為人們很少將它們寫成冪等的。一個典型的例子是您自己的,每次都將相同的目錄添加到
fpath
路徑中,這當然意味著每次搜尋該路徑需要更長的時間。毫無疑問,這不是你做這種事情的唯一地方,而且。您也沒有正確理解自動載入。正如 doco 所述,第一次執行函式時會自動載入沒有主體的函式。顯然,如果函式已經載入,因此有一個主體,它不會再次載入。
您需要再次
unfunction
呼叫該函式autoload
。
.zshrc
Z shell 原始碼中的範例包含一個freload()
函式,該函式對所有作為其參數命名的函式執行此操作。它也可以typeset -U path cdpath fpath manpath
,請注意。