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