2014-07-05 26 views
0

爲了某種目的,我在ZSH中編寫了一堆函數,名稱類似於X_somename say,用戶將從命令行運行。將會有大約20個。如何組織我的ZSH代碼?在單個文件與多個文件中的多種方法

我不知道這是一種更優化的方式(相對於代碼的組織,性能等) -

  1. 在一個文件中,X.zsh將所有的東西,包含函數的定義,每個都具有形式X_somename在.zshrc

  2. 的名稱,然後源X.zsh創建單獨的文件,每一個都具有象X_somename的名稱,包括含有它們在PATH的環境變量的文件夾

謝謝。

回答

1

通常的做法是定義函數,每個文件一個,並將文件夾放入您的fpath。您還應該標記用於自動加載的功能。函數不應該是一個shell腳本(所以不要將它們添加到您的路徑中,而是添加到您的fpath(函數路徑))。

http://zsh.sourceforge.net/Doc/Release/Functions.html

fpath=(~/myfuncs $fpath) 
autoload myfunc1 myfunc2 ... 

我實際上做的是:

if [[ -d $ZDIR/code ]]; then 
    # Autoload shell functions from $ZDIR/code with the executable bit on. 
    for func in $ZDIR/code/*(N-.x:t); do 
     unhash -f $func 2>/dev/null 
     autoload +X $func 
    done 
fi 

只是要注意,有KSH風格功能,在其中添加function foo(),從頁面我上面鏈接:

如果設置了KSH_AUTOLOAD選項,或者該文件只包含一個簡單的 函數的定義,文件的內容將被執行。這個 通常將定義所討論的功能,但也可以執行初始化,該初始化在執行功能 的上下文中執行,並且因此可以定義本地參數。如果函數沒有通過加載文件來定義,那麼這是一個錯誤 。

否則,函數體(沒有包圍'funcname(){...}') 被視爲文件的完整內容。該表格允許將 文件直接用作可執行的shell腳本。如果文件的處理 導致函數被重新定義,則函數 本身不會被重新執行。爲了強制shell執行初始化,然後調用定義的函數,文件應該包含 除 之外的初始化代碼(將被執行然後被丟棄),除了完整的函數定義(其將被保留用於 後續調用函數),以及對包含任何參數的shell函數 的調用。

+0

如果在所有函數文件中使用autoload + x ..然後使用autoload有什麼意義?不是加載該功能,而是加載按需?如何比使用所有函數定義獲取文件更好? – 0cd

+0

抱歉,如果我很困惑。 IRRC「+ X」僅適用於類似KSH的功能。在實踐中,我認爲使用自動加載不會有任何性能提升。主要優點是保持代碼隔離,並允許您通過複製文件來添加其他功能。 – Francisco

相關問題