在 Shell 腳本中調(diào)用另一個 Shell 腳本的三種方式

一、在 Shell 腳本中調(diào)用另一個 Shell 腳本的三種方式

先來說一下主要以下有幾種方式:

  • 1 fork: 如果腳本有執(zhí)行權(quán)限的話舟误,path/to/foo.sh颠毙。如果沒有,sh path/to/foo.sh肌索。
  • 2 exec: exec path/to/foo.sh
  • 3 source: source path/to/foo.sh
1.1 fork

fork 是最普通的, 就是直接在腳本里面用 path/to/foo.sh 來調(diào)用foo.sh 這個腳本蕉拢,比如如果是 foo.sh 在當(dāng)前目錄下,就是 ./foo.sh诚亚。運(yùn)行的時候 terminal 會新開一個子 Shell 執(zhí)行腳本 foo.sh晕换,子 Shell 執(zhí)行的時候, 父 Shell 還在。子 Shell 執(zhí)行完畢后返回父 Shell站宗。子 Shell 從父 Shell 繼承環(huán)境變量闸准,但是子 Shell 中的環(huán)境變量不會帶回父 Shell。

1.2 exec

exec 與 fork 不同梢灭,不需要新開一個子 Shell 來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個 Shell 內(nèi)執(zhí)行夷家。但是使用 exec 調(diào)用一個新腳本以后, 父腳本中 exec 行之后的內(nèi)容就不會再執(zhí)行了。這是 exec 和 source 的區(qū)別.

1.3 source

與 fork 的區(qū)別是不新開一個子 Shell 來執(zhí)行被調(diào)用的腳本敏释,而是在同一個 Shell 中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中進(jìn)行獲取和使用库快。

其實從命名上可以感知到其中的細(xì)微區(qū)別,下面通過兩個腳本來體會三種調(diào)用方式的不同:
第一個腳本颂暇,命名為script1.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"

第二個腳本缺谴,我們命名為 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"

注:這兩個腳本中的參數(shù) 用于返回腳本的 PID , 也就是進(jìn)程 ID。這個例子是想通過顯示 PID 判斷兩個腳本是分開執(zhí)行還是同一進(jìn)程里執(zhí)行,也就是是否有新開子 Shell湿蛔。當(dāng)執(zhí)行完腳本 2.sh 后膀曾,腳本 1.sh 后面的內(nèi)容是否還執(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í)行了添谊,運(yùn)行順序為1-2-1,從兩者的PID值察迟,可以看出斩狱,兩個腳本是分成兩個進(jìn)程運(yùn)行的。

$ ./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方式運(yùn)行的結(jié)果是扎瓶,2執(zhí)行完成后所踊,不再回到1。運(yùn)行順序為1-2概荷。從pid值看秕岛,兩者是在同一進(jìn)程中運(yùn)行的。

$ ./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é)果是兩者在同一進(jìn)程里運(yùn)行误证。該方式相當(dāng)于把兩個腳本先合并再運(yùn)行继薛。

二. 等待.sh腳本僅在另一個腳本完成后才能運(yùn)行?

2.1 &&連接器

只需使用&&連接器(即復(fù)合命令):

./script1.sh && ./script2.sh

但是請注意愈捅,只有script1.sh 即第一個腳本退出代碼為0(即沒有錯誤)時遏考,才會執(zhí)行第二個腳本。

2.2 蓝谨;連接器

如果要執(zhí)行序列灌具,無論第一個腳本的結(jié)果如何,只需執(zhí)行以下操作

./script1.sh ; ./script2.sh

您可以測試兩個連接器的行為:

$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa

總結(jié)
除了exec 之外像棘,其他都可以順序執(zhí)行稽亏,只是如果對環(huán)境變量有要求的話,就要分辨使用fork還是source了
作者:大城市的小蝸牛
源鏈接:https://blog.csdn.net/m0_46535940/article/details/124959568

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缕题,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胖腾,更是在濱河造成了極大的恐慌烟零,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咸作,死亡現(xiàn)場離奇詭異锨阿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)记罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門墅诡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桐智,你說我怎么就攤上這事末早⊙滔冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵然磷,是天一觀的道長郑趁。 經(jīng)常有香客問我,道長姿搜,這世上最難降的妖魔是什么寡润? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舅柜,結(jié)果婚禮上梭纹,老公的妹妹穿的比我還像新娘。我一直安慰自己致份,他們只是感情好变抽,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著知举,像睡著了一般瞬沦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雇锡,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天逛钻,我揣著相機(jī)與錄音,去河邊找鬼锰提。 笑死曙痘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立肘。 我是一名探鬼主播边坤,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谅年!你這毒婦竟也來了茧痒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤融蹂,失蹤者是張志新(化名)和其女友劉穎旺订,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體超燃,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡区拳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了意乓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樱调。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笆凌,到底是詐尸還是另有隱情圣猎,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布菩颖,位于F島的核電站样漆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晦闰。R本人自食惡果不足惜放祟,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呻右。 院中可真熱鬧跪妥,春花似錦、人聲如沸声滥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落塑。三九已至纽疟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憾赁,已是汗流浹背污朽。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留龙考,地道東北人蟆肆。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像晦款,于是被迫代替她去往敵國和親炎功。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容