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

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

  • 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

execfork 不同炮障,不需要新開一個(gè)子 Shell 來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個(gè) Shell 內(nèi)執(zhí)行目派。但是使用 exec 調(diào)用一個(gè)新腳本以后, 父腳本中 exec 行之后的內(nèi)容就不會(huì)再執(zhí)行了。這是 execsource 的區(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

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

exec 方式運(yùn)行的結(jié)果是涎永,2.sh 執(zhí)行完成后,不再回到 1.sh。運(yùn)行順序?yàn)?1-2土辩。從pid值看支救,兩者是在同一進(jìn)程 PID=82287 中運(yùn)行的抢野。

source

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í)行叉跛。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末松忍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筷厘,更是在濱河造成了極大的恐慌鸣峭,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酥艳,死亡現(xiàn)場(chǎng)離奇詭異摊溶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)充石,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門莫换,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骤铃,你說我怎么就攤上這事拉岁。” “怎么了惰爬?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵喊暖,是天一觀的道長。 經(jīng)常有香客問我补鼻,道長哄啄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任风范,我火速辦了婚禮咨跌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硼婿。我一直安慰自己锌半,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布寇漫。 她就那樣靜靜地躺著刊殉,像睡著了一般殉摔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上记焊,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天逸月,我揣著相機(jī)與錄音,去河邊找鬼遍膜。 笑死碗硬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓢颅。 我是一名探鬼主播恩尾,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挽懦!你這毒婦竟也來了翰意?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤信柿,失蹤者是張志新(化名)和其女友劉穎冀偶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體角塑,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔫磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圃伶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堤如。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窒朋,靈堂內(nèi)的尸體忽然破棺而出搀罢,到底是詐尸還是另有隱情,我是刑警寧澤侥猩,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布榔至,位于F島的核電站,受9級(jí)特大地震影響欺劳,放射性物質(zhì)發(fā)生泄漏唧取。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一划提、第九天 我趴在偏房一處隱蔽的房頂上張望枫弟。 院中可真熱鬧,春花似錦鹏往、人聲如沸淡诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韩容。三九已至款违,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間群凶,已是汗流浹背插爹。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留座掘,地道東北人递惋。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像溢陪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睛廊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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