先來說一下主要以下有幾種方式:
-
fork: 如果腳本有執(zhí)行權(quán)限的話椎组,
path/to/foo.sh
贺纲。如果沒有,sh path/to/foo.sh
。 -
exec:
exec path/to/foo.sh
-
source:
source path/to/foo.sh
fork
fork
是最普通的, 就是直接在腳本里面用 path/to/foo.sh
來調(diào)用
foo.sh 這個(gè)腳本滞磺,比如如果是 foo.sh 在當(dāng)前目錄下,就是 ./foo.sh
神僵。運(yùn)行的時(shí)候 terminal 會(huì)新開一個(gè)子 Shell 執(zhí)行腳本 foo.sh雁刷,子 Shell 執(zhí)行的時(shí)候, 父 Shell 還在。子 Shell 執(zhí)行完畢后返回父 Shell保礼。 子 Shell 從父 Shell 繼承環(huán)境變量沛励,但是子 Shell 中的環(huán)境變量不會(huì)帶回父 Shell。
exec
exec
與 fork
不同炮障,不需要新開一個(gè)子 Shell 來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個(gè) Shell 內(nèi)執(zhí)行目派。但是使用 exec
調(diào)用一個(gè)新腳本以后, 父腳本中 exec
行之后的內(nèi)容就不會(huì)再執(zhí)行了。這是 exec
和 source
的區(qū)別.
source
與 fork
的區(qū)別是不新開一個(gè)子 Shell 來執(zhí)行被調(diào)用的腳本胁赢,而是在同一個(gè) Shell 中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中進(jìn)行獲取和使用企蹭。
其實(shí)從命名上可以感知到其中的細(xì)微區(qū)別,下面通過兩個(gè)腳本來體會(huì)三種調(diào)用方式的不同:
第一個(gè)腳本智末,我們命名為 1.sh
:
#!/usr/bin/env bash
A=1
echo "before exec/source/fork: PID for 1.sh = $$"
export A
echo "In 1.sh: variable A=$A"
case $1 in
--exec)
echo -e "==> using exec…\n"
exec ./2.sh ;;
--source)
echo -e "==> using source…\n"
. ./2.sh ;;
*)
echo -e "==> using fork by default…\n"
./2.sh ;;
esac
echo "after exec/source/fork: PID for 1.sh = $$"
echo -e "In 1.sh: variable A=$A\n"
第二個(gè)腳本谅摄,我們命名為 2.sh
:
#!/usr/bin/env bash
echo "PID for 2.sh = $$"
echo "In 2.sh get variable A=$A from 1.sh"
A=2
export A
echo -e "In 2.sh: variable A=$A\n"
注:這兩個(gè)腳本中的參數(shù) $$
用于返回腳本的 PID , 也就是進(jìn)程 ID。這個(gè)例子是想通過顯示 PID 判斷兩個(gè)腳本是分開執(zhí)行還是同一進(jìn)程里執(zhí)行系馆,也就是是否有新開子 Shell送漠。當(dāng)執(zhí)行完腳本 2.sh
后,腳本 1.sh
后面的內(nèi)容是否還執(zhí)行由蘑。
chmod +x 1.sh 2.sh
給兩個(gè)腳本加上可執(zhí)行權(quán)限后執(zhí)行情況:
fork
fork
方式可以看出闽寡,兩個(gè)腳本都執(zhí)行了,運(yùn)行順序?yàn)?-2-1尼酿,從兩者的PID值(1.sh PID=82266, 2.sh PID=82267)爷狈,可以看出,兩個(gè)腳本是分成兩個(gè)進(jìn)程運(yùn)行的裳擎。
exec
exec
方式運(yùn)行的結(jié)果是涎永,2.sh 執(zhí)行完成后,不再回到 1.sh。運(yùn)行順序?yàn)?1-2土辩。從pid值看支救,兩者是在同一進(jìn)程 PID=82287 中運(yùn)行的抢野。
source
source方式的結(jié)果是兩者在同一進(jìn)程里運(yùn)行拷淘。該方式相當(dāng)于把兩個(gè)腳本先合并再運(yùn)行。
Command | Explanation |
---|---|
fork | 新開一個(gè)子 Shell 執(zhí)行指孤,子 Shell 可以從父 Shell 繼承環(huán)境變量启涯,但是子 Shell 中的環(huán)境變量不會(huì)帶回給父 Shell。 |
exec | 在同一個(gè) Shell 內(nèi)執(zhí)行恃轩,但是父腳本中 exec 行之后的內(nèi)容就不會(huì)再執(zhí)行了 |
source | 在同一個(gè) Shell 中執(zhí)行结洼,在被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中進(jìn)行獲取和使用,相當(dāng)于合并兩個(gè)腳本在執(zhí)行叉跛。 |
參考: