Shell

關於兒童貝殼的三個問題:壽命和創造

  • September 10, 2020
  1. 子殼的生命在它創建後不久就結束了嗎?即,它的資產是否被將要在其中執行的程序所取代?假設我們grep -r "something"在 bash 中執行,所以我們的 shell(bash) 創建了一個子程序,它最初不是“grep”,起初它只是 bash 本身的一個分支,但是因為我們最終希望“grep”成為執行,子 shell 的資產將*“迅速”*被 grep 的程序替換。(在圖中:Shell —>“Child Shell”(壽命短?)—> Process)
  2. 所有 shell 命令都創建子 shell 嗎?例如,執行像“ls -l”這樣簡單的命令也會在很短的時間內創建一個子程序嗎?因為同樣的原因(如 1 中所述)在這裡再次適用,“ls”本身就是一個程序,當它執行時,我們不希望它的程序替換我們自己的 shell 的程序。
  3. 如果 2 的答案是“是”,這是否意味著執行包含許多 shell 命令的 shell 腳本會導致創建“許多”子 shell 和程序?

區分程序及其內部執行的內容很重要(您的問題表明您知道這種區別)。每當在一個程序中執行的給定程序想要執行另一個程序時,它有兩個選擇:它可以要求作業系統在目前程序中用新程序(函式族exec替換它,或者它可以要求作業系統創建一個新程序(fork函式然後在該程序中要求作業系統在新程序中用新程序替換它。

  1. 當您grep從 shell 執行時,shell 通常希望在之後重新獲得控制權,因此它會分叉,grep在分叉中執行,然後等待分叉的程序完成。所以,是的,fork 中的 shell 是短暫的,但是在大多數目前作業系統上,“創建”fork 中的 shell 的“資產”根本不會花費太多(感謝寫時複製機制)。
  2. 這同樣適用於ls -l來自互動式外殼的。但是,在某些情況下,shell 會替換自己而不是分叉;請參閱為什麼 bash 不會為簡單命令生成子 shell?詳情。
  3. 執行 shell 腳本將為執行腳本的 shell 創建一個程序,為 shell 中的每個外部命令創建一個程序,並可能為某些 shell 結構創建子 shell。

創建流程成本低,但成本exec低;這就是人們經常關心限制正在使用的程序數量的部分原因。另外兩個可能更重要的原因是啟動程序涉及該程序啟動的成本,並且通常涉及重複整個過程的部分(比較find ... -exec grepgrep -r在具有後者的系統上,或多次呼叫grepsed比較為單個sedawk)。一旦由於過度依賴外部命令而開始在 shell 腳本中遇到速度問題,這通常表明是時候使用功能更強大的程式環境了,該環境將允許在不涉及其他程序的情況下進行更多數據處理。

引用自:https://unix.stackexchange.com/questions/608723