在shell腳本中調(diào)用另一個腳本的三種不同方法(fork, exe
fork ( /directory/script.sh)
fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調(diào)用script.sh這個腳本。運行的時候開一個sub-shell執(zhí)行調(diào)用的腳本,sub-shell執(zhí)行的時候, parent-shell還在。sub-shell執(zhí)行完畢后返回parent-shell. sub-shell從parent-shell繼承環(huán)境變量.但是sub-shell中的環(huán)境變量不會帶回parent-shell
exec (exec /directory/script.sh)
exec與fork不同,不需要新開一個sub-shell來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個shell內(nèi)執(zhí)行。但是使用exec調(diào)用一個新腳本以后, 父腳本中exec行之后的內(nèi)容就不會再執(zhí)行了。這是exec和source的區(qū)別
source (source /directory/script.sh)
與fork的區(qū)別是不新開一個sub-shell來執(zhí)行被調(diào)用的腳本,而是在同一個shell中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中得到和使用。
可以通過下面這兩個腳本來體會三種調(diào)用方式的不同:
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
#!/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"
注:這兩個腳本中的參數(shù)$$用于返回腳本的pid值,這個是例子是想通過顯示pid號區(qū)別,兩個腳本是分開執(zhí)行還是同一進程里執(zhí)行。當(dāng)執(zhí)行完腳本2后,腳本1后面的內(nèi)容是否還執(zhí)行。
執(zhí)行情況:
$ ./1.sh
PID for 1.sh before exec/source/fork:5845
1.sh: $A is B
using fork by default…
PID for 2.sh: 5242
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845
1.sh: $A is B
fork方式可以看出,兩個腳本都執(zhí)行了,運行順序為1-2-1,從兩者的PID值,可以看出,兩個腳本是分成兩個進程運行的。
$ ./1.sh exec
PID for 1.sh before exec/source/fork:5562
1.sh: $A is B
using exec…
PID for 2.sh: 5562
2.sh get $A=B from 1.sh
2.sh: $A is C
exec方式運行的結(jié)果是,2執(zhí)行完成后,不再回到1。運行順序為1-2。從pid值看,兩者是在同一進程中運行的。
$ ./1.sh source
PID for 1.sh before exec/source/fork:5156
1.sh: $A is B
using source…
PID for 2.sh: 5156
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156
1.sh: $A is C
source方式的結(jié)果是兩者在同一進程里運行。該方式相當(dāng)于把兩個腳本先合并再運行。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。