Linux Shell 工作原理
阿新 • • 發佈:2019-01-01
Linux系統提供給使用者的最重要的系統程式是Shell命令語言解釋程式。它不屬於核心部分,而是在核心之外,以使用者態方式執行。
其基本功能是解釋並執行使用者打入的各種命令,實現使用者與Linux核心的介面。系統初啟後,核心為每個終端使用者建立一個程序去
執行Shell解釋程式。它的執行過程基本上按如下步驟:
(1)讀取使用者由鍵盤輸入的命令列。 (2)分析命令,以命令名作為檔名,並將其它引數改造為系統呼叫execve( )內部處理所要求的形式。 (3)終端程序呼叫fork( )建立一個子程序。 (4)終端程序本身用系統呼叫wait4( )來等待子程序完成(如果是後臺命令,則不等待)。當子程序執行時呼叫execve( ), 子程序根據檔名(即命令名)到目錄中查詢有關檔案(這是命令解釋程式構成的檔案),將它調入記憶體,執行這個程式(解釋這條命令)。 (5)如果命令末尾有&號(後臺命令符號),則終端程序不用系統呼叫wait4( )等待,立即發提示符,讓使用者輸入下一個命令,轉⑴。 如果命令末尾沒有&號,則終端程序要一直等待,當子程序(即執行命令的程序)完成處理後終止,向父程序(終端程序)報告, 此時終端程序醒來,在做必要的判別等工作後,終端程序發提示符,讓使用者輸入新的命令,重複上述處理過程。
Linux系統的shell作為作業系統的外殼,為使用者提供使用作業系統的介面。它是命令語言、命令解釋程式及程式設計語言的統稱。 shell是使用者和Linux核心之間的介面程式,如果把Linux核心想象成一個球體的中心,shell就是圍繞核心的外層。
當從shell或其他程式向Linux傳遞命令時,核心會做出相應的反應。 shell是一個命令語言直譯器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程式所呼叫。
使用者在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。 有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,
是存在於檔案系統中某個目錄下的單獨的程式。對使用者而言,不必關心一個命令是建立在shell內部還是一個單獨的程式。 shell首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程式(這裡的應用程式可以是Linux本身的實用程式,
如ls和rm,也可以是購買的商業程式,如xv,或者是自由軟體,如emacs)。然後shell在搜尋路徑裡尋找這些應用程式
(搜尋路徑就是一個能找到可執行程式的目錄列表)。如果鍵入的命令不是一個內部命令並且在路徑裡沒有找到這個可執行檔案,
將會顯示一條錯誤資訊。如果能夠成功找到命令,該內部命令或應用程式將被分解為系統呼叫並傳給Linux核心。 shell的另一個重要特性是它自身就是一個解釋型的程式設計語言,shell程式設計語言支援絕大多數在高階語言中能見到
的程式元素,如函式、變數、陣列和程式控制結構。shell程式語言簡單易學,任何在提示符中能鍵入的命令都能放到一個
可執行的shell程式中。 當普通使用者成功登入,系統將執行一個稱為shell的程式。正是shell程序提供了命令列提示符。作為預設值
(TurboLinux系統預設的shell是BASH),對普通使用者用“$”作提示符,對超級使用者(root)用“#”作提示符。 一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的引數。shell將執行這些命令。如果一條命令花費了很長的
時間來執行,或者在螢幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷訊號來中斷它(在正常結束之前,中止它的執行)。 當用戶準備結束登入對話程序時,可以鍵入logout命令、exit命令或檔案結束符(EOF)(按ctrl+d實現),結束登入。