小鳥初學Shell程式設計(三)指令碼不同執行方式的影響
執行命令的方式
執行Shell指令碼的方式通常有以下四種
- 方式一:
bash ./test.sh
- 方式二:
./test.sh
- 方式三:
source ./test.sh
- 方式四:
. ./test.sh
執行方式的區別
方式一bash
方式執行指令碼的話,會在當前的終端下面產生一個bash子程式來執行指令碼,所以對當前的環境是沒有影響的。
[root@lincoding usr]# bash ./test.sh
複製程式碼
方式二./test.sh
的方式執行,則指令碼第一行宣告是哪個Shell直譯器就會產生哪個Shell直譯器的子程式來執行指令碼,如果宣告的Shell直譯器是bash,則與方式一類似。
[root@lincoding usr]# ./test.sh
複製程式碼
方式三和方式四執行的時候,和上面的方式一和方式略有點不同。 因為他執行的時候是通過當前的終端來執行Shell指令碼的,不會產生子程式,所以會當前的環境是有影響的。
[root@lincoding usr]# source ./test.sh
[root@lincoding usr]# . ./test.sh
複製程式碼
執行方式的影響對比
上述也提及到了方式一和方式二,由於是會產子程式來執行Shell指令碼,所以對當前的環境是沒有影響的;而方式二和方式三,是在當前的終端執行Shell指令碼,所以是會對當前的環境是有影響的。
舉個栗子,編寫一個切換目錄的test.sh指令碼,內容如下
#!/bin/bash
# 切換到tmp目錄
cd /tmp
# 列印當前目
pwd
複製程式碼
那麼使用方式一執行test.sh指令碼,其結果如下:
[root@lincoding /]# bash test.sh
/tmp
[root@lincoding /]# pwd
/
複製程式碼
可以發現,使用方式一去執行指令碼,不需要給予執行許可權。
方式二執行test.sh指令碼,其結果如下:
[root@lincoding /]# chmod u+x test.sh
[root@lincoding /]# ls -l test.sh
-rwxr--r--. 1 root root 64 Sep 26 18:34 test.sh
[root@lincoding /]# ./test.sh
/tmp
[root@lincoding /]# pwd
/
複製程式碼
方式一和方式二執行完切換到/tmp
目錄的Shell指令碼後,終端所在的目錄沒有變化,還是在/
根目錄,說明方式一和方式二的執行方式是對當前的環境是沒有影響的。
原因就是方式一和二執行Shell指令碼時,會產生子程式來執行Shell指令碼,當指令碼執行結束後,子程式退出,回到了父程式,那麼對當前所在的環境就不會產生影響。
接下來看,方式三執行結果:
[root@omp120 /]# source ./test.sh
/tmp
[root@omp120 tmp]# pwd
/tmp
複製程式碼
方式四執行結果:
[root@omp120 /]# . ./test.sh
/tmp
[root@omp120 tmp]# pwd
/tmp
複製程式碼
從上面方式三和方式四的執行結果,可以發現,執行完切換到/tmp
目錄的Shell指令碼後,當前的終端環境所在的目錄已經被切換了到了/tmp
目錄,說明方式三和方式四的執行方式是對當前的環境是有影響的。
小結
方式一和方式二執行Shell指令碼時,會產生子程式來執行Shell指令碼,當指令碼執行結束後,子程式退出,回到了父程式,那麼對當前所在的環境就不會產生影響。
而方式二和方式四是在當前環境執行Shell指令碼,也就是在當前程式執行Shell指令碼,其執行的結果就會影響當前的環境。