2016-10-20 46 views
2

在NVM README.markdown它說什麼是源代碼的shell函數?

請注意,which nvm是行不通的,因爲nvm是來源於殼 功能,而不是一個可執行二進制文件。

我發現什麼是NVM安裝過程中會更新.bashrc

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm 

不知怎的,這使得提供給外殼的nvm命令。我的問題是什麼是「源代碼shell函數」,命令nvm執行的是什麼?

+0

如果你想知道名爲'nvm'的函數的作用,運行'type nvm'來定義它的文本後 –

+0

順便說一句,我假設在我的答案中,你知道shell函數通常是什麼。目前的問題並沒有說明這個假設是否有根據。 –

+0

另外:如果bash特定的,'nvm.sh'是錯誤的,應該改爲'nvm.bash';雖然通常使用'.sh' [在最好的時候相當不幸](https://www.talisman.org/~erlkonig/documents/commandname-extensions-considered-harmful/),當它錯誤地暗示它是完全有害的與其他POSIX shell的兼容性 - ksh,dash,ash等 - 對於沒有通過shebang調用的腳本,不能指定它自己的解釋器。 –

回答

3

這種言論是草率的。 nvm只是一個shell函數,通過定義該函數的文件來定義。這不會以任何定性的方式改變函數:如果你手動輸入它,它將是相同的函數,具有所有相同的行爲,所以將「sourced」作爲修飾符應用有點誤導;可以更準確地說nvm.sh是一個源腳本,它定義了一個名爲nvm的shell函數。


至於具體的語法:

. somefile 

是寫

source somefile 

的更便攜的方式......它執行當前shell內somefile的行動,而不是在一個單獨的shell作爲子進程運行。因此,採購腳本可以修改您當前的解釋器 - 設置變量,更改其工作目錄,以及,定義別名和函數 - 以執行外部程序的方式不能。


澄清:如果你跑bash somefile,然後通過somefile定義的任何功能只爲bash特定副本的持續存在 - 當它退出並返回你的提示,在somefile定義函數將不更久可用。相比之下,當你source somefile,因爲somefile的內容是在你當前的shell實例中執行的,所以這些內容能夠持久化。

+0

謝謝,很好解釋。我確實發現nvm.sh裏面有一個名爲nvm的函數。我不知道你可以將源文件中的函數作爲命令提供給shell。 – user3885927

+0

採購腳本的效果幾乎與手動輸入交互式shell中的每個命令相同。因此,如果可以通過在命令行中鍵入函數來定義函數,則可以通過提供包含其定義的腳本來定義該函數。 –

+0

有道理,感到尷尬它沒有發生在我:( – user3885927