從Unix的早期開始,shell就已經成為用戶與操作系統的接口的一部分。第一個Unix shell具有非常有限的功能,主要是I / O重定向和命令管道。后來的shell在那個早期的shell上進行了擴展,并增加了越來越多的功能,這給了我們強大的功能,包括單詞擴展,歷史替換,循環和條件表達式等。那么如何構建一個Linux Shell?
為什么使用本教程?
在過去的20年中,我一直使用GNU / Linux作為主要操作系統。我使用了許多GNU / Linux shell,包括但不限于bash,ksh和zsh。但是,我一直被這個問題困擾:是什么使shell打勾?例如,例如:
Shell如何解析我的命令,將它們轉換為可執行指令,然后執行這些命令?
Shell如何執行不同的單詞擴展過程,例如參數擴展,命令替換和算術擴展?
Shell如何實現I / O重定向?.. 等等。
由于大多數GNU / Linux外殼都是開源的,因此,如果您想學習外殼的內部工作原理,可以在線搜索源代碼并開始深入研究。但是,這個建議實際上說起來容易做起來難。例如,您應該從哪里開始閱讀代碼?哪些源文件包含實現I / O重定向的代碼?在哪里可以找到解析用戶命令的代碼?我想你明白了。
這就是為什么我決定編寫本教程的原因,以幫助Linux用戶和程序員更好地理解其shell。我們將一起從頭開始實現一個功能齊全的Linux Shell 。在此過程中,我們將看到Linux shell如何通過實際編寫執行上述任務的C代碼來管理解析和執行命令,循環和條件表達式。我們將討論字擴展和I / O重定向,并看到執行功能的代碼。
在本教程結束時,我們將擁有一個基本的Linux shell,目前尚不能做很多事情,但是在接下來的部分中我們將對其進行擴展和改進。在本系列的最后,我們將提供一個功能齊全的Linux shell,該shell可以解析和執行一組相當復雜的命令,循環和表達式。
您將需要什么
為了遵循本教程,您將需要以下內容:
一個運行良好的GNU / Linux系統。
GCC來編譯代碼。
編寫代碼的文本編輯器。
如何用C編程
我不會在這里詳細介紹安裝所需軟件的細節。如果不確定如何使系統運行上述任何軟件包,請參考Linux發行版的文檔,并確保在進行下一步操作之前已完成所有設置。
現在讓我們開始做生意。我們將從對構成Linux shell的鳥瞰圖開始。
Linux Shell的組件
Shell是一個復雜的軟件,包含許多不同的部分。
任何Linux殼的核心部分是命令行解釋,或CLI。這部分有兩個目的:讀取和解析用戶命令,然后執行解析的命令。您可以將CLI本身分為兩部分:解析器和執行器。
該解析器將掃描輸入,將其分解到令牌。甲令牌由一個或多個字符,和表示輸入的單個單元。例如,令牌可以是變量名,關鍵字,數字或算術運算符。
該分析器采用這些令牌,組在一起,并創建我們所說的一種特殊結構抽象語法樹,或AST。您可以將AST視為您提供給Shell的命令行的高級表示。解析器獲取AST并將其傳遞給執行器,該執行器讀取AST并執行解析后的命令。
Shell的另一部分是用戶界面,通常在Shell處于交互模式時操作。在這里,shell循環運行,我們稱為Read-Eval-Print-Loop或REPL。
就像循環的名稱所示,shell讀取輸入,解析并執行輸入,然后循環讀取下一個命令,依此類推,直到輸入以下命令為止: exit , shutdown, 要么 reboot。
大多數外殼程序實現一種稱為符號表的結構,該外殼程序用于存儲有關變量及其值和屬性的信息。我們將在本教程的第二部分中實現符號表。
Linux Shell還具有歷史記錄功能,該功能使用戶可以訪問最新輸入的命令,然后無需過多輸入即可編輯和重新執行命令。Shell也可以包含內置實用程序,它們是作為Shell程序本身的一部分實現的一組特殊命令。
內置實用程序包括常用命令,例如cd,fg和bg。在學習本教程時,我們將實現許多內置實用程序。
現在我們知道了典型Linux shell的基本組件,讓我們開始構建自己的shell。
我們的第一個殼
我們第一個版本的shell不會做任何花哨的事情。它只會打印一個提示字符串,讀取一行輸入,然后將輸入回顯到屏幕上。在本教程的后續部分中,我們將添加解析和執行命令,循環,條件表達式等的功能。
讓我們從為該項目創建目錄開始。我通常使用~/projects/ 用于我的新項目,但是請隨意使用您喜歡的任何方式。
我們要做的第一件事是編寫我們的基本REPL循環。創建一個名為main.c,然后使用您喜歡的文本編輯器將其打開。在您的計算機中輸入以下代碼main.c 文件:
#include
#include
#include
#include
#include "shell.h"
int main(int argc, char **argv)
{
char *cmd;
do
{
print_prompt1();
cmd = read_cmd();
if(!cmd)
{
exit(EXIT_SUCCESS);
}
if(cmd[0] == ' 主站蜘蛛池模板: 毛片一区二区三区四区 | 亚洲精品久久久久综合 | 亚洲成AV人片在线观看ww | 在线国产欧美 | 老司机久久一区二区三区 | 窝窝午夜看片 | 97香蕉碰碰人妻国产欧美 | 四虎成人www成人影视网址 | 噜啊噜在线成人A片观看 | 最美情侣中文在线播放 | 99久热RE在线精品99RE6 | 无码专区在线观看韩国 | 久久影院在线观看 | 久久精品女同亚洲女同13 | 一本一道色欲综合网中文字幕 | 中文字幕奶水喷出在线观看 | 国产AV成人无码精品网站 | 中国一级毛片 | 亚洲美女国产精品久久久久久久久 | 激情综合激情五月俺也去 | 中文字幕人妻第一区 | 亚洲综合天堂AV网站在线观看 | 女人张开腿让男人桶个爽 | 丰满人妻被公侵犯日本 | 97久久精品人人槡人妻人人玩 | 欧美色99| 亚洲毛片AV日韩AV无码 | 国产精华液一线二线三线 | 亚洲 激情 小说 另类 欧美 | 亚州AAA片欧洲免费观看高 | 色妞色综合久久夜夜 | 免费h网站在线观看的 | 国内综合精品午夜久久资源 | 久久婷婷五月综合色99啪ak | 色综合久久久无码中文字幕波多 | 精品人妻无码一区二区三区抖音 | 国产福利片无码区在线观看 | 毛片a级毛片免费观看品善网 | 国产精品久久久久久久日韩 | 成人H动漫精品一区二区无码 | 在线欧美小视频 |