佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 在Shell腳本中調(diào)用另一個(gè)腳本的三種方式講解

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

熱門標(biāo)簽:地方門戶網(wǎng)站 呼叫中心市場(chǎng)需求 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) Linux服務(wù)器 服務(wù)外包 AI電銷

先來(lái)說(shuō)一下主要以下有幾種方式:

  • fork: 如果腳本有執(zhí)行權(quán)限的話,path/to/foo.sh。如果沒(méi)有,sh path/to/foo.sh。
  • exec: exec path/to/foo.sh
  • source: source path/to/foo.sh

fork

fork 是最普通的, 就是直接在腳本里面用 path/to/foo.sh 來(lái)調(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 來(lái)執(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 來(lái)執(zhí)行被調(diào)用的腳本,而是在同一個(gè) Shell 中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中進(jìn)行獲取和使用。

其實(shí)從命名上可以感知到其中的細(xì)微區(qū)別,下面通過(guò)兩個(gè)腳本來(lái)體會(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è)例子是想通過(guò)顯示 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)行。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

您可能感興趣的文章:
  • Java程序去調(diào)用并執(zhí)行shell腳本及問(wèn)題總結(jié)(推薦)
  • Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能
  • 詳解Shell腳本中調(diào)用另一個(gè)Shell腳本的三種方式
  • Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息【推薦】
  • JAVA如何調(diào)用Shell腳本
  • Shell腳本中引用、調(diào)用另一個(gè)腳本文件的2種方法
  • Java調(diào)用linux shell腳本的方法
  • Nodejs中調(diào)用系統(tǒng)命令、Shell腳本和Python腳本的方法和實(shí)例
  • Shell腳本調(diào)用另一個(gè)腳本的三種方法

標(biāo)簽:蘭州 衡水 仙桃 黃山 湖南 銅川 湘潭 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在Shell腳本中調(diào)用另一個(gè)腳本的三種方式講解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    林口县| 永福县| 高陵县| 焉耆| 岳阳县| 分宜县| 梅州市| 普兰县| 伊吾县| 准格尔旗| 高邮市| 阿瓦提县| 保德县| 象州县| 长治县| 临夏县| 赤壁市| 崇文区| 鲁山县| 若尔盖县| 鹤峰县| 甘德县| 龙陵县| 平果县| 报价| 延寿县| 茂名市| 叶城县| 嘉善县| 高密市| 灵璧县| 广水市| 葫芦岛市| 长葛市| 许昌市| 江山市| 桐梓县| 宿州市| 宁阳县| 安图县| 顺昌县|