在bash shell中,source、exec以及sh都可以用來執行shell script,但是它們的差別在哪里呢?
sh:父進程會fork一個子進程,shell script在子進程中執行
source:在原進程中執行,不會fork子進程
exec:在原進程中執行,但是同時會終止原進程
注:使用export會把父進程中的變量向子進程中繼承,但是反過來卻不行,在子進程中,不管環境如果改變,均不會影響父進程
下面用一個例子來講解
- 1.sh
- #!/bin/bash
- A=B
- echo "PID for 1.sh before exec/source/fork:$"
- export A
- echo "1.sh: \$A is $A"
- case $1 in
- exec)
- echo "using exec..."
- exec ./2.sh ;;
- source)
- echo "using source..."
- . ./2.sh ;;
- *)
- echo "using fork by default..."
- ./2.sh ;;
- esac
- echo "PID for 1.sh after exec/source/fork:$"
- echo "1.sh: \$A is $A"
- 2.sh
- CODE:
- #!/bin/bash
- echo "PID for 2.sh: $"
- echo "2.sh get \$A=$A from 1.sh"
- A=C
- export A
- echo "2.sh: \$A is $A"
下面在命令行中去執行
./1.sh fork

可以看到,1.sh是在父進程中執行,2.sh是在子進程中執行的,父進程的PID是5344,而子進程的是5345,當子進程執行完畢后,控制權返回到父進程。同時,在子進程改變環境變量A的值不會影響到父進程。
./1.sh source

由結果可知,1.sh和2.sh都是在同一進程中執行的,PID為5367
./1.sh exec

可知,兩個腳本都是在同一進程中執行,但是請注意,使用exec終止了原來的父進程,因此,可以看到
- echo "PID for 1.sh after exec/source/fork:$"
- echo "1.sh: \$A is $A"
這兩個命令沒有執行
由這個例子,便大致可了解它們的區別了
浙公網安備 33010602011771號