可執行檔是否在目前 shell 或子 shell 中「運行」?

可執行檔是否在目前 shell 或子 shell 中「運行」?

我正在運行一個在 bash 中調用的簡單可執行檔hello。它詢問用戶輸入並列印出回應。我像這樣運行它./hello

提示和使用者輸入其回應都發生在當前 shell 中,但我認為它應該在不同的 shell 中運行。我之所以這麼認為是因為您可以使用 source 在目前 shell 中執行 exe。

誰能向我解釋一下這是如何運作的?

在嘗試研究這個問題時,我經常遇到術語「shell 環境」和「shell 上下文」。它們是一樣的嗎?

答案1

你可能會說「shell環境」是指目前shell的環境,其中包括目前的環境變數。該環境由任何啟動的子進程(子 shell 或其他)繼承。

「shell 上下文」是一個不常用的術語,但我假設它相當於「進程上下文」。對於 shell 腳本,這將包括 shell 環境以及當前的 shell 變數、檔案描述符(標準輸入、標準輸出和標準錯誤以及任何其他明確開啟的)、訊號處理程序(使用trap)等。 ,進程上下文將在對的呼叫中繼承fork(),但不能在後續exec()呼叫中繼承(只有環境在對 的呼叫中倖存exec())。

當您執行hello程式時(我假設它是一個 shell 腳本),輸入和輸出發生在執行該hello腳本的 shell 的上下文中。這是“當前外殼”。您輸入的 shell./hello是其父 shell,並hello繼承其環境。

在內部,父 shell 執行fork()exec()呼叫來啟動最終將執行腳本的 shell hello

事實上,hello腳本在同一位置進行提示終端因為您啟動腳本的位置僅表示執行腳本的 shell 是目前的前台進程。父 shell 正在等待它完成。完成後,父 shell 將再次成為終端機中的前台進程。

source ./hello當您使用或啟動腳本時. ./hello,腳本將在與您鍵入該命令的 shell 相同的上下文中執行。這意味著它可能會修改互動式 shell 的上下文和環境。例如,它可能會更改當前工作目錄(更改環境)或安裝訊號處理程序(更改上下文),並且當腳本完成執行時這些更改仍將是「活動的」。

如果hello程式是編譯的二進位文件,它將繼承呼叫 shell 的環境,但不會共享其上下文(檔案描述符等)。它並不是真正在子 shell 中運行,因為它不是 shell 腳本。父 shell 將移至後台,等待程式完成,就像 shell 腳本一樣。從父 shell 的角度來看,啟動已編譯的二進位檔案或 shell 腳本沒有區別。

已編譯的二進位檔案不能以source.(點)開頭,因為 shell 不知道如何解釋二進位檔案。


這個答案有點揮手,但我相信它基本上是正確的。如果有任何內容需要更正或添加,請發表評論(或編輯)。

相關內容