Shell-Script

zsh:source 命令不會重新載入函式

  • January 2, 2020

(這是在帶有 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

.zshrcZ shell 原始碼中的範例包含一個freload()函式,該函式對所有作為其參數命名的函式執行此操作。它也可以typeset -U path cdpath fpath manpath,請注意。

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