2014-02-28 33 views

回答

11

sh file執行一個新的shell進程shell腳本文件。

. file在當前shell進程中執行shell腳本文件。

./file將執行當前目錄中的文件。該文件可以是二進制可執行文件,也可以以hashbang行開頭(文件的第一行的格式爲#!....,例如文件中的#!/usr/bin/ruby表示該腳本需要作爲Ruby文件執行)。該文件需要設置可執行標誌。


例如,如果您有腳本test.sh

#!/bin/sh 

TEST=present 

和你sh test.sh執行它,你會推出一個新的sh(或者說bash,最有可能的,因爲一個是softlinked到現代系統中的另一個),然後在其中定義一個新變量,然後退出。隨後的echo $TEST會打印一個空行 - 該變量未在外殼中設置。

如果您使用. test.sh啓動它,則需要使用當前shell執行該腳本。 echo $TEST的結果將打印present

如果您在使用./test.sh啓動它,第一行#!/bin/sh將被檢測到,那麼這將是完全一樣,如果你寫/bin/sh ./test.sh,在這種情況下,可以歸結爲第一個場景。但是,如果hashbang行是例如#!/usr/bin/perl -w,則該文件將被執行/usr/bin/perl -w ./test.sh

+0

非常感謝。雖然我能夠通過./運行.sh文件,但沒有提到hashbang這一行。怎麼可能呢? –

+1

如果沒有hashbang行,'bash'會認爲它是一個shell腳本文件。如果你想使用任何其他解釋器,你確實需要一個hashbang。 – Amadan

+0

再次感謝:) –

6

在簡單的話,sh file1執行sh命令/可執行file1的作爲參數。在這種情況下,當sh可執行文件讀取並攔截文件中的命令時,file1不需要執行權限

./file1它只是運行/執行可執行文件file1,因此它需要可執行權限。在這種情況下,它會在shebang #!/bin/sh中提到的shell上執行,如果它沒有在當前shell中提及它。

希望藉助上述內容不亂:)