Bash
別名 vs 函式 vs 腳本
這個網站說,“Shell 函式更快
$$ than aliases $$. 別名在函式之後查找,因此解析速度較慢。雖然別名更容易理解,但對於幾乎所有目的來說,shell 函式都比別名更受歡迎。” 鑑於此(無論是否正確),shell 函式與獨立 shell 腳本相比如何?一個比另一個有什麼特別的優勢,還是更適合某些類型的任務?
別名和函式之間的主要區別在於別名不帶參數¹,但函式可以。當你寫類似的東西時
alias l='ls --color'
,l foo
被擴展為ls --color foo
; 你不能抓住foo
別名擴展並用它做一些不同的事情,就像你可以用函式做的那樣。另請參閱如何將參數傳遞給別名?.在函式之前查找別名:如果您同時擁有一個函式和一個名為 的別名
foo
,foo
則呼叫該別名。(如果foo
正在擴展別名,它會被暫時阻止,這會使事情變得像alias ls='ls --color'
工作一樣。此外,您可以隨時通過執行繞過別名\foo
。)但我不希望看到可測量的性能差異。函式和獨立腳本的功能大多相似;以下是我能想到的一些區別:
一個函式在 shell 環境中執行;腳本在單獨的程序中執行。因此一個函式可以改變shell 環境:定義環境變數,改變目前目錄,等等。一個獨立的腳本不能做到這一點。
函式必須用您要使用它的 shell 的語言編寫。腳本可以用任何語言編寫。
函式在定義時被載入。每次呼叫腳本時都會載入腳本。這有幾個後果:
- 如果您修改了一個腳本,您將在下次呼叫它時獲得新版本。如果更改函式的定義,則必須重新載入定義。
- 在負載較重的系統上,函式更快。
- 如果您有很多您可能不會使用的功能,它們會佔用記憶體。Ksh 和 zsh,但我認為不是 bash,具有函式自動載入的形式。
介於函式和獨立腳本之間的東西是您使用
source
or.
內置讀取的腳本片段。和函式一樣,它可以修改 shell 的環境,並且必須用 shell 的語言編寫。就像腳本一樣,它在每次呼叫時都會載入,並且不會很快。¹是的,我知道,這不適用於 tcsh。