Linux——创建bash命令解释器项目

发布于:2022-10-21 ⋅ 阅读:(545) ⋅ 点赞:(0)

目录

1、bash介绍

 2、命令的分类

3、项目框架

4、项目代码

5、项目运行结果

1、bash介绍

  • bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从cshksh借鉴而来。总的来说,bash虽然是一个满足POSIX规范的shell,但有很多扩展。
  • bash:命令解释器。

bash自身fork复制一份,子进程替换一份。

 2、命令的分类

①内置命令:cd exit等;

②普通命令: ls pwd cp ps等,通过which可以找到。

bash :复制自身,复制出来一个子进程, 替换ps/ls

3、项目框架

4、项目代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>

#define ARG_MAX 10

char *get_cmd(char *buff,char*myargv[])
{
    if(buff==NULL||myargv==NULL)
    {
        return NULL;
    }

    int i=0;
    char*s=strtok(buff," ");
    while(s!=NULL)
    {
        myargv[i++]=s;
        s=strtok(NULL," ");
    }
    return myargv[0];
}

void run_cmd(char*path,char*myargv[])
{
    if(path==NULL||myargv==NULL )
     {
        return;
     }
    pid_t pid=fork();
    if(pid==-1)
    {
        return;
    }

    if(pid==0)
    {
        //ti huan
        execvp(path,myargv);
        perror("execvp error\n");
        exit(0);//子进程必须要退出
    }
    else
    {
        wait(NULL);
    }
}
    
int main()
{
    while(1)
    {
         printf("stu@localhost ~$");//默认的
        fflush(stdout);

        char buff[128]={0};
        fgets(buff,128,stdin);

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

        char*myargv[ARG_MAX]={0};

        char*cmd=get_cmd(buff,myargv);
        if(cmd==NULL)
        {
            continue;
        }
        else if(strcmp(cmd,"cd")==0)
        {
        }
        else if(strcmp(cmd,"exit")==0)
        {
          break;
        }
        else//普通命令
        {
            //fork+exec;
             run_cmd(cmd,myargv);
        }

    }
    exit(0);
}

5、项目运行结果

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到