伊人99re_av日韩成人_91高潮精品免费porn_色狠狠色婷婷丁香五月_免费看的av_91亚色网站

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁 > IT資訊 > IT運(yùn)維 > 如何構(gòu)建一個Linux Shell(一)

如何構(gòu)建一個Linux Shell(一)

2020-07-23 18:22:47 | 來源:中培企業(yè)IT培訓(xùn)網(wǎng)

從Unix的早期開始,shell就已經(jīng)成為用戶與操作系統(tǒng)的接口的一部分。第一個Unix shell具有非常有限的功能,主要是I / O重定向和命令管道。后來的shell在那個早期的shell上進(jìn)行了擴(kuò)展,并增加了越來越多的功能,這給了我們強(qiáng)大的功能,包括單詞擴(kuò)展,歷史替換,循環(huán)和條件表達(dá)式等。那么如何構(gòu)建一個Linux Shell?

  為什么使用本教程?

在過去的20年中,我一直使用GNU / Linux作為主要操作系統(tǒng)。我使用了許多GNU / Linux shell,包括但不限于bash,ksh和zsh。但是,我一直被這個問題困擾:是什么使shell打勾?例如,例如:

Shell如何解析我的命令,將它們轉(zhuǎn)換為可執(zhí)行指令,然后執(zhí)行這些命令?

Shell如何執(zhí)行不同的單詞擴(kuò)展過程,例如參數(shù)擴(kuò)展,命令替換和算術(shù)擴(kuò)展?

Shell如何實(shí)現(xiàn)I / O重定向?.. 等等。

由于大多數(shù)GNU / Linux外殼都是開源的,因此,如果您想學(xué)習(xí)外殼的內(nèi)部工作原理,可以在線搜索源代碼并開始深入研究。但是,這個建議實(shí)際上說起來容易做起來難。例如,您應(yīng)該從哪里開始閱讀代碼?哪些源文件包含實(shí)現(xiàn)I / O重定向的代碼?在哪里可以找到解析用戶命令的代碼?我想你明白了。

這就是為什么我決定編寫本教程的原因,以幫助Linux用戶和程序員更好地理解其shell。我們將一起從頭開始實(shí)現(xiàn)一個功能齊全的Linux Shell 。在此過程中,我們將看到Linux shell如何通過實(shí)際編寫執(zhí)行上述任務(wù)的C代碼來管理解析和執(zhí)行命令,循環(huán)和條件表達(dá)式。我們將討論字?jǐn)U展和I / O重定向,并看到執(zhí)行功能的代碼。

在本教程結(jié)束時(shí),我們將擁有一個基本的Linux shell,目前尚不能做很多事情,但是在接下來的部分中我們將對其進(jìn)行擴(kuò)展和改進(jìn)。在本系列的最后,我們將提供一個功能齊全的Linux shell,該shell可以解析和執(zhí)行一組相當(dāng)復(fù)雜的命令,循環(huán)和表達(dá)式。

  您將需要什么

為了遵循本教程,您將需要以下內(nèi)容:

一個運(yùn)行良好的GNU / Linux系統(tǒng)。

GCC來編譯代碼。

編寫代碼的文本編輯器。

  如何用C編程

我不會在這里詳細(xì)介紹安裝所需軟件的細(xì)節(jié)。如果不確定如何使系統(tǒng)運(yùn)行上述任何軟件包,請參考Linux發(fā)行版的文檔,并確保在進(jìn)行下一步操作之前已完成所有設(shè)置。

現(xiàn)在讓我們開始做生意。我們將從對構(gòu)成Linux shell的鳥瞰圖開始。

  Linux Shell的組件

Shell是一個復(fù)雜的軟件,包含許多不同的部分。

任何Linux殼的核心部分是命令行解釋,或CLI。這部分有兩個目的:讀取和解析用戶命令,然后執(zhí)行解析的命令。您可以將CLI本身分為兩部分:解析器和執(zhí)行器。

該解析器將掃描輸入,將其分解到令牌。甲令牌由一個或多個字符,和表示輸入的單個單元。例如,令牌可以是變量名,關(guān)鍵字,數(shù)字或算術(shù)運(yùn)算符。

該分析器采用這些令牌,組在一起,并創(chuàng)建我們所說的一種特殊結(jié)構(gòu)抽象語法樹,或AST。您可以將AST視為您提供給Shell的命令行的高級表示。解析器獲取AST并將其傳遞給執(zhí)行器,該執(zhí)行器讀取AST并執(zhí)行解析后的命令。

Shell的另一部分是用戶界面,通常在Shell處于交互模式時(shí)操作。在這里,shell循環(huán)運(yùn)行,我們稱為Read-Eval-Print-Loop或REPL。

就像循環(huán)的名稱所示,shell讀取輸入,解析并執(zhí)行輸入,然后循環(huán)讀取下一個命令,依此類推,直到輸入以下命令為止: exit , shutdown, 要么 reboot。

大多數(shù)外殼程序?qū)崿F(xiàn)一種稱為符號表的結(jié)構(gòu),該外殼程序用于存儲有關(guān)變量及其值和屬性的信息。我們將在本教程的第二部分中實(shí)現(xiàn)符號表。

Linux Shell還具有歷史記錄功能,該功能使用戶可以訪問最新輸入的命令,然后無需過多輸入即可編輯和重新執(zhí)行命令。Shell也可以包含內(nèi)置實(shí)用程序,它們是作為Shell程序本身的一部分實(shí)現(xiàn)的一組特殊命令。

內(nèi)置實(shí)用程序包括常用命令,例如cd,fg和bg。在學(xué)習(xí)本教程時(shí),我們將實(shí)現(xiàn)許多內(nèi)置實(shí)用程序。

現(xiàn)在我們知道了典型Linux shell的基本組件,讓我們開始構(gòu)建自己的shell。

  我們的第一個殼

我們第一個版本的shell不會做任何花哨的事情。它只會打印一個提示字符串,讀取一行輸入,然后將輸入回顯到屏幕上。在本教程的后續(xù)部分中,我們將添加解析和執(zhí)行命令,循環(huán),條件表達(dá)式等的功能。

讓我們從為該項(xiàng)目創(chuàng)建目錄開始。我通常使用~/projects/ 用于我的新項(xiàng)目,但是請隨意使用您喜歡的任何方式。

我們要做的第一件事是編寫我們的基本REPL循環(huán)。創(chuàng)建一個名為main.c,然后使用您喜歡的文本編輯器將其打開。在您的計(jì)算機(jī)中輸入以下代碼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] == '

主站蜘蛛池模板: 中文字幕综合在线观看 | aaa特黄| 免费A级毛片无码无遮挡 | 国产农民工嫖妓老女人 | 久久婷婷日日澡天天添 | 国产精品99蜜臀久久不卡二区 | 国产黄色一级片视频 | 性欧洲xxxx| 亚洲精品无码aⅴ片大战 | 小荡货奶真大水真多紧视频 | 国产亚洲精品精品精品 | 日本免费三片免费观看东热 | 国产免费8X高清在线 | 日本少妇高潮喷水视频 | 亚州中文无码aⅤ在线 | 亚洲精品久久久久中文第一暮 | 久久久精品波多野结衣AV | 久久99精品久久久久久狂牛 | 亚洲国产精品91 | 性欧美一区二区三区 | 永井玛利亚精品国产一区 | 亚洲中文字幕久爱亚洲伊人 | 国产高潮流白浆啊免费A片动态 | 亚洲伊人成无码综合影院 | 亚洲中文字幕无码久久精品1 | 自拍偷拍国产 | 国产精品初高中精品久久 | 一个人看的免费高清视频www | 成人国产精品色哟哟 | 国产爆乳无码av在线播放 | 激情懂色av一区av二区av | 合欧美一区二区三区 | 一级片短视频 | 曰本人做爰大片免费观看 | 国产最新视频在线观看 | 久久天天躁狠狠躁夜夜躁2O2O | 91深夜视频 | 日本a级片免费 | 美女福利视频一区二区 | 久久久国产精品成人免费 | 日日干夜夜爽 |