2009-05-28 100 views
19

在unix命令行中,通過簡單鍵入名稱來執行程序與通過鍵入a執行程序之間有什麼區別。 (點)後跟程序名?例如爲:unix命令行執行。 (dot)vs. without

runme 

. runme 
+0

如果我在PuTTy終端中執行第二個操作,它會關閉... – schnaader 2009-05-28 19:10:44

+0

相關:http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script -and-sourcing-a-bash-scrip/176788#176788 – lesmana 2011-12-04 18:34:53

回答

24

. name將源文件稱爲name放入當前shell。所以,如果一個文件中包含該

A=hello 

然後,如果你來源,事後你可以參考一個叫A變量,它包含你好。但是,如果你執行該文件(給予適當的執行權限和#!/interpreter線),那麼這樣的事情是行不通的,因爲變量和其他的東西,劇本集將僅影響子shell它在運行。

採購一個二進制文件沒有任何意義:Shell不會知道如何解釋二進制文件(記住它將該文件中出現的東西插入到當前shell中 - 就像C中舊的#include <file>機制一樣)。例如:

head -c 10 /dev/urandom > foo.sh; . foo.sh # don't do this at home! 
bash: �ǻD$�/�: file or directory not found 

執行的二進制文件,但是,做當然有很大的意義。所以通常你只想命名你想要執行的文件,在特殊情況下,比如上面的A=hello,你想要一個文件。

15

使用 「source」 或 「.」 導致的命令在當前的進程中運行。將腳本作爲可執行文件運行會爲其提供自己的進程。

如果你想設置在當前的shell(你不能在一個單獨的進程做的)環境變量或要中止腳本不中斷你的shell(您可以在一個只有做這個最重要單獨的過程)。

+0

該流程的區別爲我澄清了一切。 – Kvass 2013-12-18 17:37:25

5

第一個執行命令。第二個是在另一個腳本中包含shell腳本的簡寫。

4

此語法用於「加載」並解析腳本。當你有一個腳本與一堆其他腳本有共同的功能時,它是非常有用的,你可以「點包含」它。有關詳細信息,請參閱http://tldp.org/LDP/abs/html/internal.html(向下滾動到「點」命令)。

4

運行「runme」會創建一個新的進程,它將以很小的方式進行並且不會影響你的shell。

運行「。runme」將允許腳本「runme」更改您的環境變量,更改目錄以及您可能希望爲其執行的各種其他操作。它只能這樣做,因爲它正在被已經爲你運行的shell進程解釋。因此,如果您將bash作爲登錄shell運行,則只能使用「。」。帶有bash腳本的符號,而不是(例如)C shell腳本中的二進制文件。