bash 的 export -f 的 zsh 等價物是什麼
所以我開始使用
zsh
. 我喜歡它。它看起來很酷很漂亮,而且目前工作目錄和實際命令行位於不同的行這一事實很好,但同時,我注意到這zsh
可能比 慢一點bash
,尤其是在將文本列印到螢幕。我最喜歡的是
zsh
與我在.bashrc
.一個抱怨雖然。這些功能都執行良好,但我無法弄清楚導出系統是如何工作的。
我導出了其中一些
.bashrc
函式,以便我可以在其他地方使用它們,例如在腳本和外部程序中,使用export -f
.在 zsh 中,似乎甚至沒有談論導出。是自動載入嗎?這兩件事是一樣的嗎?我很難弄清楚這一點。
包含函式的環境變數是 bash hack。Zsh 沒有類似的東西。你可以用幾行程式碼做類似的事情。環境變數包含字元串;在Shellshock被發現之前,舊版本的 bash將函式的程式碼儲存在一個變數中,該變數的名稱是函式的名稱,其值
() {
後跟函式程式碼,後跟}
. 您可以使用以下程式碼導入具有此編碼的變數,並嘗試使用類似 bash 的設置執行它們。請注意,zsh 無法模擬所有 bash 功能,您所能做的就是靠近一點(例如,$foo
拆分值並擴展萬用字元,並使數組從 0 開始)。bash_function_preamble=' emulate -LR ksh ' for name in ${(k)parameters}; do [[ "-$parameters[name]-" = *-export-* ]] || continue [[ ${(P)name} = '() {'*'}' ]] || continue ((! $+builtins[$name])) || continue functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"} done
(正如Shellshock 的最初發現者Stéphane Chazelas所指出的,如果函式定義格式不正確,這個答案的早期版本可以在此時執行任意程式碼。這個版本不會,但當然只要你執行任何命令,它可能是從環境中導入的函式。)
Post-Shellshock 版本的 bash 使用無效變數名(例如
BASH_FUNC_myfunc%%
)在環境中對函式進行編碼。這使得它們更難可靠地解析,因為 zsh 不提供從環境中提取此類變數名稱的介面。我不建議這樣做。依賴腳本中的導出函式是一個壞主意:它會在腳本中創建一個不可見的依賴項。如果您曾經在沒有您的功能的環境中執行您的腳本(在另一台機器上,在一個 cron 作業中,在更改您的 shell 初始化文件之後,……),您的腳本將不再工作。相反,將所有函式儲存在一個或多個單獨的文件中(類似於
~/lib/shell/foo.sh
),並通過導入它使用的函式來啟動腳本(. ~/lib/shell/foo.sh
)。這樣,如果你修改foo.sh
,你可以很容易地搜尋到哪些腳本依賴它。如果你複製一個腳本,你可以很容易地找出它需要哪些輔助文件。Zsh(和之前的 ksh)通過提供一種在使用它們的腳本中自動載入函式的方法,使這更加方便。約束是每個文件只能放置一個函式。將函式聲明為自動載入,並將函式定義放在一個文件中,該文件的名稱是函式的名稱。將此文件放在列出的目錄中
$fpath
(您可以通過FPATH
環境變數進行配置)。在您的腳本中,使用autoload -U foo
.此外 zsh 可以編譯腳本,以節省解析時間。呼叫
zcompile
以編譯腳本。這將創建一個帶有.zwc
副檔名的文件。如果此文件存在,autoload
則將載入編譯文件而不是原始碼。您可以使用該zrecompile
函式來(重新)編譯目錄中的所有函式定義。