吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么shell腳本中執行命令要加exec?這個exec有什么作用呢?

dyquk4xk2p3d ? 來源:ytcoode ? 2023-08-21 09:10 ? 次閱讀

0x01 示例

正常情況下,如果我們想要在shell腳本中執行一個命令,我們只用將該命令原樣寫到這個shell腳本中就好了。

但有時候我們會發現,在一些shell腳本中,在某個命令之前,會有一個exec,比如下圖所示:

556cab1a-3fb2-11ee-ac96-dac502259ad0.png

上圖中,我們要在shell腳本中執行一個sleep命令,但在該命令之前,我們加了個exec,那這個exec有什么作用呢?

0x02 exec的作用

我們先看下exec對應的文檔,看看官方是如何解釋的。

因為exec是bash的一個內置命令,所以我們可以在bash中,用help命令,查詢exec對應的文檔。

55944d82-3fb2-11ee-ac96-dac502259ad0.png

上圖文檔的大致意思為,將shell替換為exec指定的命令,這個解釋比較模糊,我們做幾個實驗具體看下。

0x03 實驗

還是使用上面的那個腳本,不過我們先把exec去掉,然后執行。

在該腳本執行后,我們用ps命令查看和該腳本相關的進程樹:

55b495e2-3fb2-11ee-ac96-dac502259ad0.png

由上圖可見,我們先在bash中執行了a.sh這個測試腳本,然后又在a.sh腳本中,執行了sleep命令。

該執行結果產生了上圖中的進程樹,即sleep進程的父進程為a.sh進程,a.sh進程的父進程為bash進程。

我們再把exec加回來,然后再執行該腳本,該次執行后,和a.sh腳本相關的進程樹為:

55d6178a-3fb2-11ee-ac96-dac502259ad0.png

看上圖中,這次沒有了a.sh進程,為什么呢?因為它被sleep程序替換掉了。

這就是exec的用的,它會告訴linux內核,直接在當前shell腳本進程中,加載并執行目標程序。

這一過程會覆蓋掉原shell腳本進程中的各種代碼和數據信息,使得原shell腳本進程立即停止運行,并轉向執行目標程序代碼。

exec命令本質上是執行了execve系統調用,如果想要了解該命令的具體細節,可以查看execve的man文檔。

0x04 注意事項

因為exec會立即抹掉當前shell腳本進程中的各種數據,然后加載并執行目標程序代碼,所以在exec命令之后,除了錯誤檢查邏輯外,不應該再有其他邏輯,因為這些邏輯永遠都不會被執行了。

看個例子:

568ae854-3fb2-11ee-ac96-dac502259ad0.png

看上圖中,只輸出了hello,并沒有輸出world,因為echo world命令寫在了exec echo hello命令之后,它是不會被執行的。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21743
  • Shell
    +關注

    關注

    1

    文章

    366

    瀏覽量

    23445

原文標題:為什么shell腳本中執行命令要加exec

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux執行shell腳本的兩種方式

    shell腳本,通常這個腳本通過一系列的操作編寫的腳本,這些腳本都主要用于應用的啟動停止等。那么
    發表于 11-18 16:49 ?1863次閱讀
    Linux<b class='flag-5'>中</b><b class='flag-5'>執行</b><b class='flag-5'>shell</b><b class='flag-5'>腳本</b>的兩種方式

    【Linux學習雜談】之exec族函數

    。小技巧:which + 命令,可以查看命令所在的全路徑假設我們執行ls -a -l這個命令
    發表于 09-08 13:14

    labview執行系統命令函數system exec.vi的使用

    網上關于labview執行系統命令函數system exec.vi的使用有些少。好幾次要用它,都要花好長時間去找資源研究怎么使用。想在這里再問一下,關于
    發表于 01-21 09:32

    Shell腳本編程筆記(二)

    本帖最后由 iysheng 于 2017-2-26 11:18 編輯 exec命令總結:腳本調試參數總結:字符串比較:shell數值比較:sh
    發表于 02-26 11:15

    [轉]find命令結合exec和xargs使用的區別

    本文轉自:老男孩教育官網轉載請注明出處:https://www.oldboyedu.com/zuixin_wenzhang/index/id/269.htmlfind命令結合exec和xargs
    發表于 09-03 15:26

    如何創建和執行一個簡單的Linux shell腳本

     如果您愿意嘗試更長的shell腳本,請將下面的shell腳本(并附加為PDF和ODT文件)復制到文本編輯器
    的頭像 發表于 11-06 17:28 ?1.3w次閱讀

    find exec命令實例教程

    Linux find命令是根據指定條件搜索文件和目錄的絕佳工具。exec允許您對找到的文件執行指定操作。
    的頭像 發表于 12-06 17:08 ?2815次閱讀

    通過一個腳本搞懂fork、source和exec

    Source模式下,子shell執行時獲取的環境變量會會影響到父shell。與fork的區別在于,不會額外打開一個sub-shell執行
    的頭像 發表于 02-03 16:05 ?1834次閱讀

    Qt的三個exec之間什么聯系

    在Qt,常見到三個exec,第一個是QApplication::exec(),第二個是QEventLoop::exec,第三個是QThread::
    的頭像 發表于 03-06 09:44 ?2551次閱讀

    shell腳本本身自帶的命令詳解

    除了以文件形式保存在/usr/bin下面的命令shell腳本還可以使用shell本身自帶的命令
    的頭像 發表于 05-23 09:32 ?1101次閱讀
    <b class='flag-5'>shell</b><b class='flag-5'>腳本</b>本身自帶的<b class='flag-5'>命令</b>詳解

    shell腳本基本命令

    Shell腳本是一種可執行文件,它包含了一組用某種特定語言編寫的命令,這些命令可以被解釋器(如bash)
    的頭像 發表于 11-08 10:08 ?2223次閱讀

    shell腳本串行和并行執行設置

    Shell腳本,你可以使用不同的技巧來實現串行和并行執行。 串行執行 實現串行
    的頭像 發表于 11-08 10:25 ?2613次閱讀

    shell并行執行java腳本

    Shell是一種用于解釋執行命令腳本語言,而Java是一種跨平臺的面向對象編程語言。在某些情況下,我們可能需要在Shell腳本
    的頭像 發表于 11-08 10:29 ?744次閱讀

    docker exec命令的使用方法

    有用的命令,用于在正在運行的容器執行命令。 在本文中,我將詳細介紹Docker exec命令的使用方法,包括
    的頭像 發表于 11-23 09:33 ?1710次閱讀

    執行shell腳本的方式包括什么

    執行Shell腳本的方式很多種,以下是一些常見的方法: 直接運行腳本文件 在命令
    的頭像 發表于 08-30 15:17 ?392次閱讀
    定日县| 百家乐官网视频游戏挖坑| 百家乐官网娱乐场开户注册| 88娱乐城2官方网站| 百家乐高命中打法| 百家乐官网大赌场娱乐网规则| 波克棋牌官网| 百家乐蓝盾有赢钱的吗| 百家乐官网技巧下载| 网页百家乐官网游戏| 大发888电脑版下载| 网络百家乐娱乐| 百家乐官网开发软件| ican博彩通| 百家乐最新首存优惠| 宜春市| 大发888娱乐场大发888娱乐场 | 金城百家乐官网玩法平台| 太阳城网上娱乐| 申博太阳城官网| 百家乐游戏模拟| 百家乐玩家技巧分享| 百家乐官网获胜秘决百家乐官网获胜秘诀| 澳门赌场筹码| 威尼斯人娱乐平台反| 百家乐一邱大师打法| 百家乐赢钱| 上海百家乐赌博| 赌场百家乐官网打法| 百家乐官网正确的打法| 云阳县| 广丰县| 现金百家乐官网伟易博| 皇冠足球网开户| 尊龙国际| 真人轮盘游戏| 大赢家娱乐城| 澳门足球博彩| 永利高网址| 百家乐官网破解赌戏玩| 百家乐官网3珠路法|