Linux shell指令運行的原理


shell是一種命令行解釋器

    對於一般用戶,我們不能直接使用操作系統(kernel)。而是通過 kernel的“外殼”程序,也就是所謂的shell,來與kernel溝通。
    為什么不能直接使用kernel?
    從技術角度 , Shell的最簡單定義 : 命 令 行 解 釋 器(command Interpreter)
主要包含:
    a. 將使用者的命令翻譯給核心(kernel)處理。
    b. 同時,將核心的處理結果翻譯給使用者。
    對於windows GUI,我們操作windows 不是直接操作windows內核,而是通過圖形接口,點擊,從而完成我們的操作(比如如進入D盤的操作,我們通常是雙擊D盤盤符. 或者運行一個應用程序)。shell 對於Linux,有相同的作用,主要是對我們的指令進行解析,解析指令給Linux內核。反饋結果在通過內核運用出結果,通過shell解析給用戶。
shell的普遍作用

    UNIX的shell程序解釋用戶的命令, Shell腳本是解釋型的,而不是編譯型的。除了向內核傳送命令之外, shell的主要任務是提供一個可單獨配置的使用shell資源配置文件的用戶環境。
    shell任務的一個重要部分是搜索命令。 Bash是按照下一的步驟來完成的:檢查命令是否包含斜杠。如果沒有,首先檢查函數列表是否包含一個我們尋找的命令。如果命令不是一個函數,那么在內建命令列表中檢查。shell內建命令是指bash(或其它版本)工具集中的命令。一般都會有一個與之同名的系統命令,比如bash中的echo命令與/bin/echo是兩個不同的命令,盡管他們行為大體相仿。當在bash中鍵入一個命令時系統會先看他是否是一個內建命令,如果不是才會查看是否是系統命令或第三方工具。所以在bash中鍵入echo命令實際上執行bash工具集中的bash命令也就是內建命令,而不是/bin/echo這個系統命令。備注: Linux中的type命令如果命令既不是函數也不是內建命令,那么掃描列在 PATH 中的目錄列表來進行查找。 Bash使用一個 hashtable ( 內存中的數據存放區域) 來記憶可執行文件的完整路徑,這樣能防止對 PATH 的擴展搜索。如果搜索沒有成功, Bash打印一條錯誤消息並返回退出狀態127。如果搜索成功或者命令包含一個斜杠, shell在一個單獨執行環境中執行這個命令。如果因為文件是不可執行的或者不是一個目錄造成執行失敗,就假設是一個shell腳本。如果命令是異步開始的, shell會等待命令完成並收集它的退出狀態。
    shell如何運行程序。shell用fork建立新進程,用execv函數簇在新進程中運行用戶指定的程序,最后shell用wait命令等待新進程結束。 wait系統調用同時從內核取得退出狀態或者信號序號以告知子進程是如何結束的。shell輸出一個提示符,等待你輸入一行命令,然后執行這個命令。待此命令執行終止,shell隨后輸出一個提示符,等待下一個輸入的命令行。

    以hello.c程序為例。首先,shell程序執行它的指令,等待我們輸入命令。當我們在鍵盤上輸入字符串”./hello“后,shell程序就逐一讀取字符到寄存器,再把它存放到存儲器中。當我們在鍵盤上敲回車時,shell就知道我們已經結束了命令的輸入。然后shell執行一系列指令,這些指令將hello目標文件中的代碼和數據從磁盤拷貝到主存,從而加載hello文件。數據包括最終會被輸出的字符串”hello,world\n“。shell加載和執行hello程序,然后等待程序終止,hello程序在屏幕上輸出他的信息,然后終止。shell隨后輸出一個提示符,等待下一個輸入的命令行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM