Bash
在包裝腳本中執行 exec 的原因
我已經看到了包裝腳本範例,簡而言之如下:
#!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" exec "$myprog" "$@"
如上所示,它們
exec
幾乎立即用$myprog
. 如果沒有exec
:#!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" "$myprog" "$@"
在最後一個範例中,啟動了一個新的 bash 實例,然後
$myprog
作為 bash 實例的子程序啟動。第一種方法有什麼好處?
使用
exec
使包裝器更加透明,即它使呼叫腳本的使用者或應用程序不太可能需要意識到它是依次啟動“真實”程序的中繼。特別是,如果呼叫者想要終止程序,他們只會終止他們剛剛啟動的程序。如果包裝腳本執行一個子程序,呼叫者需要知道他們應該找出包裝器的子程序並殺死它。包裝腳本可以設置一個陷阱來中繼一些信號,但這不適用於無法擷取的 SIGSTOP 或 SIGKILL。
呼叫
exec
還節省了一些記憶體(以及其他資源,如 PID 等),因為它不需要保留額外的外殼而無事可做。如果有多個包裝器,問題就會加起來(難以找到要殺死的正確程序、記憶體成本等)。
一些shell(例如Korn shell)會自動檢測命令何時是最後一個並且沒有活動陷阱並放置一個隱含的
exec
,但並非全部都這樣做(例如不是bash)。