在shell腳本中調用另外一個腳本的三種不一樣方法(fork, exec, source)——轉載

原文連接:http://blog.chinaunix.net/uid-22548820-id-3181798.htmlhtml

  • fork ( /directory/script.sh) :若是shell中包含執行命令,那麼子命令並不影響父級的命令。在子命令執行完後再執行父級命令,子級的環境變量不會影響到父級

fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調用script.sh這個腳本。運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候, parent-shell還在。shell

sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變量.可是sub-shell中的環境變量不會帶回parent-shellbash

  • exec (exec /directory/script.sh):執行子級的命令後,再也不執行父級命令

exec與fork不一樣,不須要新開一個sub-shell來執行被調用的腳本. 被調用的腳本與父腳本在同一個shell內執行。可是使用exec調用一個新腳本之後, 父腳本中exec行以後的內容就不會再執行了。這是exec和source的區別ui

  • source (source /directory/script.sh):執行子級命令後繼續執行父級命令,同時子級設置的環境變量會影響到父級的環境變量

與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行. 因此被調用的腳本中聲明的變量和環境變量, 均可以在主腳本中獲得和使用.spa

能夠經過下面這兩個腳原本體會三種調用方式的不一樣:.net

1.shunix

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

2.shcode

1 #!/bin/bash
2 echo "PID for 2.sh: $$"
3 echo "2.sh get \$A=$A from 1.sh"
4 A=C
5 export A
6 echo "2.sh: \$A is $A"

執行狀況:htm

$ ./1.sh 
PID for 1.sh before exec/source/fork:5845364
1.sh: $A is B
using fork by default…
PID for 2.sh: 5242940
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845364
1.sh: $A is B
$ ./1.sh exec
PID for 1.sh before exec/source/fork:5562668
1.sh: $A is B
using exec…
PID for 2.sh: 5562668
2.sh get $A=B from 1.sh
2.sh: $A is C
$ ./1.sh source 
PID for 1.sh before exec/source/fork:5156894
1.sh: $A is B
using source…
PID for 2.sh: 5156894
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156894
1.sh: $A is C
$