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