Executable
Linux 中的主要執行階段是什麼(程序在 Linux 中基本上是如何執行的)?
我知道在 Linux 中有兩個執行階段,處理我們執行的每個命令。我將按照我對它們的理解命名,因為我不知道原始措辭:
- 外殼處理—外殼編輯命令(將其拆分為不同的行等),所有這些都是在與目前外殼不同的外殼中完成的。
- 在 shell 處理後執行結果(在我們使用的原始 shell 中)。
有人可以回答這些操作的名稱並參考他認為最適合新學習者的一些閱讀材料嗎?
- 外殼處理—外殼編輯命令(將其拆分為不同的行等)
是的,有點。Shell 將命令作為單個字元串(通常是一行輸入)獲取,並將其轉換為一組字元串,這些字元串實際上會轉到它最終執行的執行檔。shell 將空格分隔的單詞從單個字元串拆分為多個字元串,還處理引號和擴展變數等。
所以,像
ls "$options" "/filename with spaces"
可能導致三個字元串
ls
,-l
(來自 的值$options
)和/filename with spaces
(引號刪除)。這些被傳遞給exec()
執行程序的系統呼叫。所有這些都是在與目前不同的外殼中完成的。
不,不是。一些 shell 擴展(如
$( ... )
)會生成子 shell 來完成繁重的工作,但這不會發生在正常的“簡單”命令行中。
- 在 shell 處理後執行結果(在我們使用的原始 shell 中)。
實際上,在解析命令行之後執行程序是一個邏輯上獨立的步驟。但從技術上講,這發生在另一個程序中,因為在 Unix 上執行另一個程序的方式涉及首先呼叫
fork()
,它創建一個新程序作為第一個程序的副本,然後呼叫exec()
以用實際程序替換這個副本(shell)執行(例如ls
在範例中)。如果命令以
exec
( 如 in開頭exec ls
,則跳過分叉,並且 shell 將其自身替換為它正在啟動的命令。就像評論中提到的那樣,shell 內置函式(就像
echo
在許多 shell 中一樣)也經常在同一個程序中執行,沒有分叉。(以上所有內容都有些簡化。真實的 shell 可能還有其他未在此處描述的功能。)