1. 程式人生 > 程式設計 >小鳥初學Shell程式設計(三)指令碼不同執行方式的影響

小鳥初學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指令碼,其執行的結果就會影響當前的環境。