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

評(píng)論