exec、source以及bash的區別(zz)

在bash shell中,source、exec以及sh均可以用來執行shell script,可是它們的差異在哪裏呢?


sh:父進程會fork一個子進程,shell script在子進程中執行


source:在原進程中執行,不會fork子進程


exec:在原進程中執行,可是同時會終止原進程


shell

注:使用export會把父進程中的變量向子進程中繼承,可是反過來卻不行,在子進程中,無論環境若是改變,均不會影響父進程bash

 

下面用一個例子來說解.net

 

[plain]  view plain copy
 
  1. 1.sh  
  2. #!/bin/bash  
  3. A=B  
  4. echo "PID for 1.sh before exec/source/fork:$"  
  5. export A  
  6. echo "1.sh: \$A is $A"  
  7. case $1 in  
  8.         exec)  
  9.                 echo "using exec..."  
  10.                 exec ./2.sh ;;  
  11.         source)  
  12.                 echo "using source..."  
  13.                 . ./2.sh ;;  
  14.         *)  
  15.                 echo "using fork by default..."  
  16.                 ./2.sh ;;  
  17. esac  
  18. echo "PID for 1.sh after exec/source/fork:$"  
  19. echo "1.sh: \$A is $A"  

 

[plain]  view plain copy
 
  1. 2.sh  
  2. CODE:  
  3. #!/bin/bash  
  4. echo "PID for 2.sh: $"  
  5. echo "2.sh get \$A=$A from 1.sh"  
  6. A=C  
  7. export A  
  8. echo "2.sh: \$A is $A"  

下面在命令行中去執行命令行

 

./1.sh forkblog

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

 

./1.sh source進程

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

 

./1.sh execget

可知,兩個腳本都是在同一進程中執行,可是請注意,使用exec終止了原來的父進程,所以,能夠看到it

 

[plain]  view plain copy
 
  1. echo "PID for 1.sh after exec/source/fork:$"  
  2. echo "1.sh: \$A is $A"  

這兩個命令沒有執行

 

 

由這個例子,便大體可瞭解它們的區別了

相關文章
相關標籤/搜索