2012-08-31 107 views
4

例如,我想編寫一個bash shell腳本來執行循環備份,其格式爲rsync。我應該把它作爲一個獨立的腳本文件(backup.sh)還是將它包裝在一個函數中(backup)?作爲腳本文件,我可以運行它bash backup.sh。作爲一個函數,我可以把它放在一個文件中,例如foo.sh,並在我登錄時獲取它,然後我可以簡單地運行backup作爲備份我的文件的命令。問題是,這兩種策略有哪些缺點和優點?獨立shell腳本與shell函數?

更一般地說,我想知道,在什麼情況下,我應該實現一個功能作爲一個獨立的Shell腳本文件或作爲一個shell函數?

我的一些想法:我知道一些圖形會話(如KDE,Gnome等)在登錄時輸入不同的文件。如果想在圖形啓動的應用程序中使用shell函數(例如單擊圖標打開emacs),可能會造成一些混淆。但我更喜歡實現shell函數並將它們合併到文件中,我認爲它們整齊有序。

任何其他想法或建議?

回答

4

將函數用於經常使用的事物。它們佔用內存,並且在shell啓動時需要解析 - 如果您從不使用函數,則解析它會被浪費。

將腳本用於需要很長時間的事情,而您很少這麼做。每個調用的解析時間可以忽略不計,並且將腳本分開帶來的清晰度是有益的。

因此,對於備份腳本,我強烈建議使用腳本而不是函數。

+0

這個標準對我來說似乎很模糊。我真的看不到腳本帶來的清晰度。一個函數所需的資源往往是可以忽略的,不是嗎? – RNA

+1

它們有點含糊,但如果我不會每小時使用一次該代碼,它就屬於腳本。我使用腳本來處理比我更頻繁使用的東西。實際上,我在shell中有兩個函數,其中一個是因爲IT提供的'/ etc/profile'中的一個錯誤(bug:'unset pathmunge'不能刪除函數;需要'unset -f pathmunge'),而我也沒有創建另一個 - 我還沒有追蹤它的來源。我一直使用腳本;我有數百個在我的$ HOME/bin中。 [...繼續...] –

+0

[...繼續...]不要誤解我的意思;有時間使用功能。我的許多腳本都包含函數,因爲它們可以更輕鬆地編寫腳本。但是我在我的主登錄shell環境中沒有太多功能。 –

1

蟒蛇般的解決方案:

#!/bin/bash 

caller_shlvl=$1 
shift 

backup() { 
    ... 
} 

if (($caller_shlvl < $SHLVL)); then 
    backup "[email protected]" 
fi 

你可以做兩件事情之一:

bash script.sh $SHLVL other args 

當你調用腳本來運行備份,或者

source script.sh $SHLVL 
# Time passes 
backup firstarg secondarg etc 

它將在當前shell中定義函數但不執行它。

(有傳$ SHLVL作爲明確的第一個參數是最接近我能得到的用於模擬Python的

if __name__=="__main__": 

這不是很漂亮,而且很可能使這個答案不那麼有用。)