一般Linux上執行一個shell腳本,有如下幾種方法:
source test.sh
. test.sh
bash test.sh
./test.sh
source 和 .
source和 . 這兩個都是shell自帶的內建命令,這兩個命令是等價的關系。也就是說這兩條命令的執行是完全一樣的。使用 type source 和 type . 可以看出它們都是內建命令;使用 help source 和 help . 也可以看出這兩個命令的作用一模一樣。因此,這兩個命令是等價的,用哪個都行。
作用:在當前 shell 中執行一個文件中的命令。即不會啟動一個新的子 shell 進程。所有在腳本中設置的變量將成為當前Shell的一部分。
sh filename 或 bash filename
sh filename 另起一個子 shell 進程,在子 shell 中執行腳本里面的語句,該子 shell 繼承父 shell 的環境變量(但不會繼承普通變量,也就是沒有被 export 的變量)。
測試 source 和 . 和 sh
test.sh :
#!/bin/bash echo "Print Bash Path:$SHELL" echo $EXPORT_VAR echo $LOCAL_VAR
執行如下:
可以看出,. 和 source 執行結果都是一樣的,並且可以打印出當前 shell 中的變量 LOCAL_VAR,而使用 bash test.sh 則不能打印出 LOCAL_VAR,因為 bash test.sh 是另起了一個子 shell 執行的腳本,所以父 shell 中的普通變量不能繼承,但是 export 的全局的環境變量是可以繼承的。
./filename
./ 是用來執行一切可執行文件的方法,不僅僅可以用來執行shell腳本。需要特別注意的是 ./ 並不等於 . 符號,兩者是具有本質區別的。使用 ./ 執行的文件必須是可執行文件,文件必須有 x 權限。
./ 這個符號后面需要跟一個可執行文件的路徑,用於定位執行文件的位置,這個路徑可以是相對路徑。那么如何區分不同的可執行文件呢?對於shell腳本來說,我們會在開頭加上:#!/bin/bash
使用 ./ 測試 test.sh,先給 test.sh 可執行的權限,從結果中可以發現,沒有打印出普通變量 LOCAL_VAR,說明 ./ 也會另起一個 shell 進行可執行文件的執行。
參考文章
Linux shell執行source和 . 的區別_程序猿Ricky的日常干貨-CSDN博客_linux shell source
Linux下source命令詳解_在努力!-CSDN博客_linux source