国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】shell命令行簡單解釋器

這篇具有很好參考價值的文章主要介紹了【Linux】shell命令行簡單解釋器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維
回顧一下,我們前面學(xué)習(xí)了進程創(chuàng)建,進程終止,進程等待,進程替換,通過這些內(nèi)容我們可以來進行實現(xiàn)簡單的shell命令行解釋器?。?!下面我們直接來看一看如何去實現(xiàn)shell命令行解釋器:

總體分為(整體需要循環(huán)哦):

1.輸出提示符

2.輸入和獲取命令

3.fork創(chuàng)建子進程

4.內(nèi)建命令


  • 輸出提示符

這里的提示字符為用戶名@主機名 當(dāng)前路徑# 直接打印出來作為提示所用,也可以自己設(shè)置成其他的,問題不大

printf("用戶名@主機名 當(dāng)前路徑# ");

同時,這里并沒有\(zhòng)n,會有緩沖區(qū)的問題,類似于我們之前所說的進度條所遇到的問題,在這個地方哦可以用fflush(stdout)刷新緩沖區(qū)

  • 輸入和獲取命令

輸入

我們需要獲取一行的內(nèi)容,利用fgets函數(shù)獲取,同時,可以定義一個lineCommand[NUM]數(shù)組

char*s = fgets(lineCommand,sizeof(lineCommand)-1,stdin);
assert(s != NULL);

但是打印的時候卻多換了一行,這是我們把\n也讀取到了,直接進行處理即可,清除最后一個\n

lineCommand[strlen(lineCommand)-1] = 0;       

獲取

輸入之后,我們自然需要去進行獲取,我們需要分割命令行,這個地方用strtok。把字符串切割成若干個子串:

strtok:第一次直接傳遞參數(shù),第二次則必須傳NULL。且在最終strtok會返回NULL。

  • fork創(chuàng)建進程

利用fork創(chuàng)建子進程,同時父進程需要等待子進程退出返回結(jié)果

另外我們還需要選擇替換函數(shù)execvp:首先替換函數(shù)需要先帶上v,可將所有的執(zhí)行參數(shù)放入數(shù)組中統(tǒng)一傳遞,其次還要選擇帶上p,我們輸入的只有程序命令,帶上p會自動在環(huán)境變量中尋找

至此,基本的框架我們已經(jīng)搞定了。

  • shell運行原理

同時,在理解一下shell的運行原理:shell內(nèi)部提取命令行做分析,然后調(diào)用exec. shell執(zhí)行命令必須通過創(chuàng)建子進程,如果不創(chuàng)建子進程會把我們所有的shell全部替換,所以執(zhí)行命令時一般磁盤上的程序必須創(chuàng)建子進程

  • 內(nèi)建命令

我們在運行自己寫的shell的時候,發(fā)現(xiàn)輸入cd …輸入cd path等命令時發(fā)現(xiàn)路徑并沒有改變!

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維

沒有發(fā)生改變是因為自己寫的shell執(zhí)行很多命令都要fork()創(chuàng)建子進程,讓子進程執(zhí)行的cd,子進程有自己的工作目錄,所以更改的子進程的目錄,子進程執(zhí)行完畢,繼續(xù)用的是父進程,既shell,并沒有影響父進程,所以并沒有改變。

對于cd,我們可以采用內(nèi)建命令:不需要創(chuàng)建子進程執(zhí)行,讓shell自己執(zhí)行命令,稱為內(nèi)建命令。本質(zhì)就是執(zhí)行系統(tǒng)接口,我們可以調(diào)用一個系統(tǒng)接口chdir,可解決上述問題:

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維

簡易shell——代碼實現(xiàn)

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#define NUM 1024
#define OPT_NUM 64
char lineCommand[NUM];
char *myargv[OPT_NUM];
int lastCode = 0;
int lastSig = 0;
int main()
{
    while(1)
    {
        //輸出提示符
        printf("用戶名@主機名 當(dāng)前路徑#");
        fflush(stdout);
        //獲取輸入
        char*s = fgets(lineCommand,sizeof(lineCommand)-1,stdin);
        assert(s != NULL);
        (void) s;
        lineCommand[strlen(lineCommand)-1] = 0;
        // printf("test:%s\n",lineCommand);
        //ls -a -l -i  字符串切割
        myargv[0] = strtok(lineCommand," ");
        int i = 1;
        if(myargv[0]!= NULL&& strcmp(myargv[0],"ls") == 0)
        {
            myargv[i++] =(char*)"--color=auto";
        }
        //如果沒有子串,strtok會返回NULL                                                                   
        while(myargv[i++] = strtok(NULL," "));
        //如果是cd命令, 不需要創(chuàng)建子進程,讓shell自己執(zhí)行對應(yīng)的命令,本質(zhì)就是執(zhí)行系統(tǒng)接口
        //像這種不需要我們的子進程來執(zhí)行,而是讓shell自己執(zhí)行的命令 --內(nèi)建 內(nèi)置命令
        if(myargv[0]!=NULL&& strcmp(myargv[0],"cd")==0)
        {
            if(myargv[1] != NULL) chdir(myargv[1]);
            continue;
        }
        if(myargv[0]!=NULL&& myargv[1]!=NULL && strcmp(myargv[0],"echo")== 0)
        {
            if(strcmp(myargv[1],"$?") == 0)                                                              
            {
                printf("%d %d\n",lastCode,lastSig);
            }
            else 
            {
                printf("%s\n",myargv[1]);
            }
              continue;
        }
        //利用條件編譯測試代碼是否成功
#ifdef DEBUG 
        for(int i = 0;myargv[i];i++)
        {
            printf("myargv[%d]:%s\n",i,myargv[i]);
        }
#endif
        //執(zhí)行命令
        pid_t id = fork();
        assert(id!=-1);
        if(id == 0)
        {
            execvp(myargv[0],myargv);
            exit(1);
        }
        int status = 0;
        pid_t ret = waitpid(id,&status,0);
        assert(ret > 0);
        (void)ret;
        lastCode = ((status>>8)&0xFF);
        lastSig = (status & 0X7F);
    }
    return 0;
}

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維

shell命令行解釋器,學(xué)好Linux,linux,服務(wù)器,運維文章來源地址http://www.zghlxwxcb.cn/news/detail-789809.html

到了這里,關(guān)于【Linux】shell命令行簡單解釋器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Linux初階】進程替換的應(yīng)用 - 簡易命令行解釋器的實現(xiàn)

    【Linux初階】進程替換的應(yīng)用 - 簡易命令行解釋器的實現(xiàn)

    ??hello,各位讀者大大們你們好呀?? ????系列專欄:【Linux初階】 ????本篇內(nèi)容:使用代碼手段實現(xiàn)一個簡易的命令行解釋器,其中功能包括:打印輸出提示符、獲取用戶輸入、字符串切割、執(zhí)行命令、ls指令下?lián)碛蓄伾崾?、cd、echo; ????作者簡介:計算機海洋的

    2024年02月07日
    瀏覽(93)
  • bin文件夾和命令行解釋器cmd 的簡單認(rèn)識

    ??在許多軟件安裝過程中,寶寶們可能會看到一個名為 \\\"bin\\\"的文件夾 。\\\"bin\\\"是二進制(binary)的縮寫,通常用于存放可執(zhí)行文件(executable files)或二進制文件。它的主要作用是存儲程序的實際可執(zhí)行代碼,以便在需要時運行。 在數(shù)據(jù)庫和SQL專欄中,分享的 MySQL安裝教程中

    2024年02月21日
    瀏覽(88)
  • linux報錯 /bin/bash^M:解釋器錯誤:沒有那個文件或目錄

    linux報錯 /bin/bash^M:解釋器錯誤:沒有那個文件或目錄

    ??在Linux中運行腳本時,會出現(xiàn)linux報錯 /bin/bash^M:解釋器錯誤:沒有那個文件或目錄。這是因為我們將在Windows下編寫的腳本拷貝到Linux環(huán)境中運行時會出現(xiàn)運行不了的情況。主要還是Windows的換行符為rn,而Linux環(huán)境中的換行符號為n。 ??解決方法有: ??方法一: ??方法

    2024年02月13日
    瀏覽(97)
  • Linux 報錯 bash: /usr/bin/pip: 解釋器錯誤:沒有那個文件或目錄

    Linux 報錯 bash: /usr/bin/pip: 解釋器錯誤:沒有那個文件或目錄

    ? ? ? ? 今天在linux安裝python庫時,使用conda安裝太慢,換了鏡像源也沒用,于是使用pip安裝出現(xiàn)了解釋器錯誤:沒有那個文件或目錄的問題,記錄一下,或許對你有幫助。 ? ? ? ? ? ? ? ? 進入home/你的用戶名/anaconda3/envs/虛擬環(huán)境名字/bin/pip,不能直接用cd進去,可以使用na

    2024年01月18日
    瀏覽(162)
  • 【Linux】 /bin/bash^M: 壞的解釋器: 沒有那個文件或目錄[已解決]

    Windows 10 系統(tǒng)下編輯了一個shell腳本文件,然后copy到了遠(yuǎn)程的Linux服務(wù)器。 運行 xxx.sh 文件時報錯 這個文件在Windows下編輯過,在Windows下每一行結(jié)尾是nr,而Linux下則是n,所以才會有多出來的r。 使用指令 會把 xxx.sh 中的r 替換成空白。

    2024年02月12日
    瀏覽(234)
  • 【linux】linux設(shè)置ssh密鑰登錄詳細(xì)教程,附Mobaxterm和pycharm ssh python解釋器配置教程

    【linux】linux設(shè)置ssh密鑰登錄詳細(xì)教程,附Mobaxterm和pycharm ssh python解釋器配置教程

    我們通常使用SSH 客戶端來遠(yuǎn)程使用 Linux 服務(wù)器。但是,一般的密碼方式登錄,容易有密碼被暴力破解的問題。所以,一般我們會將 SSH 的端口設(shè)置為默認(rèn)的 22 以外的端口,或者禁用 root 賬戶登錄。但是即使是將端口設(shè)置為22之外的端口也容易泄露。為了保證服務(wù)器安全,此時

    2024年02月13日
    瀏覽(26)
  • 【Python入門】Python搭建編程環(huán)境-安裝Python3解釋器(內(nèi)含Windows版本、MacOS版本、Linux版本)

    【Python入門】Python搭建編程環(huán)境-安裝Python3解釋器(內(nèi)含Windows版本、MacOS版本、Linux版本)

    前言 ??作者簡介: 熱愛跑步的恒川 ,致力于C/C++、Java、Python等多編程語言,熱愛跑步,喜愛音樂的一位博主。 ??本文收錄于Python零基礎(chǔ)入門系列,本專欄主要內(nèi)容為Python基礎(chǔ)語法、判斷、循環(huán)語句、函數(shù)、函數(shù)進階、數(shù)據(jù)容器、文件操作、異常模塊與包、數(shù)據(jù)可視化等,

    2024年02月03日
    瀏覽(96)
  • 『pycharm 』解決無法添加解釋器,無法新建項目問題(是無法添加解釋器,不是沒有添加解釋器)

    『pycharm 』解決無法添加解釋器,無法新建項目問題(是無法添加解釋器,不是沒有添加解釋器)

    這個問題和大家常見的: 沒有Python解釋器 這種簡單問題不同。請看問題描述。???? 如圖,解釋器列表空空如也,即使點擊“ 添加本地解釋器 ”也沒有反應(yīng)(那個展開小三角也是空的)。 所有項目都這樣了,那里變成空的了。而且這些都是我自己的項目,之前都好好的。 刪

    2024年02月11日
    瀏覽(90)
  • 4.設(shè)計模式之后七種模式后11種模式命令訪問者迭代器發(fā)布訂閱中介者忘備錄解釋器狀態(tài)策略職責(zé)鏈和空模式

    4.設(shè)計模式之后七種模式后11種模式命令訪問者迭代器發(fā)布訂閱中介者忘備錄解釋器狀態(tài)策略職責(zé)鏈和空模式

    1.命令(command)模式 不知道命令接收者(對象)是誰,支持撤銷 (接受者 間接調(diào)用執(zhí)行 的具體行為) 命令調(diào)用者和接收者解耦 //只要實現(xiàn)命令接口即可 (就是客戶端給個命令,然后命令類傳給接收類執(zhí)行) 優(yōu)點和缺點 容易撤銷操作 命令隊列可以多線程操作 增加過多的命令類 空命令也

    2024年02月12日
    瀏覽(96)
  • Pycharm 重命名SSH的conda解釋器后,提示該解釋器不可用

    Pycharm 重命名SSH的conda解釋器后,提示該解釋器不可用

    目前已知是BUG,截至投稿日未修復(fù) 已經(jīng)提交給youtrack.jetbrains.com,如下圖:

    2024年01月17日
    瀏覽(166)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包