0x01 示例
正常情況下,如果我們想要在shell腳本中執(zhí)行一個命令,我們只用將該命令原樣寫到這個shell腳本中就好了。
但有時候我們會發(fā)現(xiàn),在一些shell腳本中,在某個命令之前,會有一個exec,比如下圖所示:
	
上圖中,我們要在shell腳本中執(zhí)行一個sleep命令,但在該命令之前,我們加了個exec,那這個exec有什么作用呢?
0x02 exec的作用
我們先看下exec對應(yīng)的文檔,看看官方是如何解釋的。
因為exec是bash的一個內(nèi)置命令,所以我們可以在bash中,用help命令,查詢exec對應(yīng)的文檔。
	
上圖文檔的大致意思為,將shell替換為exec指定的命令,這個解釋比較模糊,我們做幾個實驗具體看下。
0x03 實驗
還是使用上面的那個腳本,不過我們先把exec去掉,然后執(zhí)行。
在該腳本執(zhí)行后,我們用ps命令查看和該腳本相關(guān)的進(jìn)程樹:
	
由上圖可見,我們先在bash中執(zhí)行了a.sh這個測試腳本,然后又在a.sh腳本中,執(zhí)行了sleep命令。
該執(zhí)行結(jié)果產(chǎn)生了上圖中的進(jìn)程樹,即sleep進(jìn)程的父進(jìn)程為a.sh進(jìn)程,a.sh進(jìn)程的父進(jìn)程為bash進(jìn)程。
我們再把exec加回來,然后再執(zhí)行該腳本,該次執(zhí)行后,和a.sh腳本相關(guān)的進(jìn)程樹為:
	
看上圖中,這次沒有了a.sh進(jìn)程,為什么呢?因為它被sleep程序替換掉了。
這就是exec的用的,它會告訴linux內(nèi)核,直接在當(dāng)前shell腳本進(jìn)程中,加載并執(zhí)行目標(biāo)程序。
這一過程會覆蓋掉原shell腳本進(jìn)程中的各種代碼和數(shù)據(jù)信息,使得原shell腳本進(jìn)程立即停止運(yùn)行,并轉(zhuǎn)向執(zhí)行目標(biāo)程序代碼。
exec命令本質(zhì)上是執(zhí)行了execve系統(tǒng)調(diào)用,如果想要了解該命令的具體細(xì)節(jié),可以查看execve的man文檔。
0x04 注意事項
因為exec會立即抹掉當(dāng)前shell腳本進(jìn)程中的各種數(shù)據(jù),然后加載并執(zhí)行目標(biāo)程序代碼,所以在exec命令之后,除了錯誤檢查邏輯外,不應(yīng)該再有其他邏輯,因為這些邏輯永遠(yuǎn)都不會被執(zhí)行了。
看個例子:
	
看上圖中,只輸出了hello,并沒有輸出world,因為echo world命令寫在了exec echo hello命令之后,它是不會被執(zhí)行的。
	
	審核編輯:劉清
- 
                                LINUX內(nèi)核
                                +關(guān)注關(guān)注 1文章 317瀏覽量 22954
- 
                                Shell
                                +關(guān)注關(guān)注 1文章 373瀏覽量 25063
原文標(biāo)題:為什么shell腳本中執(zhí)行命令要加exec
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux中執(zhí)行shell腳本的兩種方式
 
    
 
           
        
 
         為什么shell腳本中執(zhí)行命令要加exec?這個exec有什么作用呢?
為什么shell腳本中執(zhí)行命令要加exec?這個exec有什么作用呢? 
                 
  
     
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評論