Linux命令執行過程(新手必讀)

2020-07-16 10:05:08
前面講過,在 Linux 系統中“一切皆檔案”,Linux 命令也不例外。那麼,當編輯完成 Linux 命令並回車後,系統底層到底發生了什麼事情呢?

簡單來說,Linux 命令的執行過程分為如下 4 個步驟。

1) 判斷路徑

判斷使用者是否以絕對路徑或相對路徑的方式輸入命令(如 /bin/ls),如果是的話直接執行。

2) 檢查別名

Linux 系統會檢查使用者輸入的命令是否為“別名命令”。要知道,通過 alias 命令是可以給現有命令自定義別名的,即用一個自定義的命令名稱來替換原本的命令名稱。

例如,我們經常使用的 rm 命令,其實就是 rm -i 這個整體的別名:

[[email protected] ~]# alias rm
alias rm='rm -i'

這使得當使用 rm 命令刪除指定檔案時,Linux 系統會要求我們再次確認是否執行刪除操作。例如:

[[email protected] ~]# rm a.txt <-- 假定當前目錄中已經存在 a.txt 檔案
rm: remove regular file 'a.txt'? y  <-- 手動輸入 y,即確定刪除
[[email protected] ~]#

這裡可以使用 unalias 命令,將 Linux 系統設定的 rm 別名刪除掉,執行命令如下:

[[email protected] ~]# alias rm
alias rm='rm -i'
[[email protected] ~]# unalias rm
[[email protected] ~]# rm a.txt
[[email protected] ~]#  <--直接刪除,不再詢問


注意,這裡僅是為了演示 unalisa 的用法,建議讀者刪除 rm 別名之後,再手動新增到系統中,執行如下命令即可再次成功新增:

[[email protected] ~]# alias rm='rm -i'

3) 判斷是內部命令還是外部命令

Linux命令列直譯器(又稱為 Shell)會判斷使用者輸入的命令是內部命令還是外部命令。其中,內部命令指的是直譯器內部的命令,會被直接執行;而使用者通常輸入的命令都是外部命令,這些命令交給步驟四繼續處理。

內部命令由 Shell 自帶,會隨著系統啟動,可以直接從記憶體中讀取;而外部命令僅是在系統中有對應的可執行檔案,執行時需要讀取該檔案。

判斷一個命令屬於內部命令還是外部命令,可以使用 type 命令實現。例如:

[[email protected] ~]# type pwd
pwd is a shell builtin  <-- pwd是內部命令
[[email protected] ~]# type top
top is /usr/bin/top  <-- top是外部命令

4) 查詢外部命令對應的可執行檔案

當使用者執行的是外部命令時,系統會在指定的多個路徑中查詢該命令的可執行檔案,而定義這些路徑的變數,就稱為 PATH 環境變數,其作用就是告訴 Shell 待執行命令的可執行檔案可能存放的位置,也就是說,Shell 會在 PATH 變數包含的多個路徑中逐個查詢,直到找到為止(如果找不到,Shell 會提供使用者“找不到此命令”)。

PATH 環境變數的改變,會直接影響 Shell 查詢 Linux 命令的過程,有關 PATH 環境變數(是什麼、如何檢視、如何修改等),可閱讀《Linux PATH環境變數》一文做詳細了解。