我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Linux】shell命令行简单解释器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Linux】shell命令行简单解释器


回顾一下,我们前面学习了进程创建,进程终止,进程等待,进程替换,通过这些内容我们可以来进行实现简单的shell命令行解释器!!!下面我们直接来看一看如何去实现shell命令行解释器:

总体分为(整体需要循环哦):

1.输出提示符

2.输入和获取命令

3.fork创建子进程

4.内建命令


  • 输出提示符

这里的提示字符为用户名@主机名 当前路径# 直接打印出来作为提示所用,也可以自己设置成其他的,问题不大

printf("用户名@主机名 当前路径# ");

同时,这里并没有\n,会有缓冲区的问题,类似于我们之前所说的进度条所遇到的问题,在这个地方哦可以用fflush(stdout)刷新缓冲区

  • 输入和获取命令

输入

我们需要获取一行的内容,利用fgets函数获取,同时,可以定义一个lineCommand[NUM]数组

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

但是打印的时候却多换了一行,这是我们把\n也读取到了,直接进行处理即可,清除最后一个\n

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

获取

输入之后,我们自然需要去进行获取,我们需要分割命令行,这个地方用strtok。把字符串切割成若干个子串:

strtok:第一次直接传递参数,第二次则必须传NULL。且在最终strtok会返回NULL。

  • fork创建进程

利用fork创建子进程,同时父进程需要等待子进程退出返回结果

另外我们还需要选择替换函数execvp:首先替换函数需要先带上v,可将所有的执行参数放入数组中统一传递,其次还要选择带上p,我们输入的只有程序命令,带上p会自动在环境变量中寻找

至此,基本的框架我们已经搞定了。

  • shell运行原理

同时,在理解一下shell的运行原理:shell内部提取命令行做分析,然后调用exec. shell执行命令必须通过创建子进程,如果不创建子进程会把我们所有的shell全部替换,所以执行命令时一般磁盘上的程序必须创建子进程

  • 内建命令

我们在运行自己写的shell的时候,发现输入cd …输入cd path等命令时发现路径并没有改变!

image-20221130111814277

没有发生改变是因为自己写的shell执行很多命令都要fork()创建子进程,让子进程执行的cd,子进程有自己的工作目录,所以更改的子进程的目录,子进程执行完毕,继续用的是父进程,既shell,并没有影响父进程,所以并没有改变。

对于cd,我们可以采用内建命令:不需要创建子进程执行,让shell自己执行命令,称为内建命令。本质就是执行系统接口,我们可以调用一个系统接口chdir,可解决上述问题:

image-20221130142857416

image-20221130142956990

简易shell——代码实现

#include #include #include #include #include #include #include #define NUM 1024#define OPT_NUM 64char lineCommand[NUM];char *myargv[OPT_NUM];int lastCode = 0;int lastSig = 0;int main(){    while(1)    {        //输出提示符        printf("用户名@主机名 当前路径#");        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命令, 不需要创建子进程,让shell自己执行对应的命令,本质就是执行系统接口        //像这种不需要我们的子进程来执行,而是让shell自己执行的命令 --内建 内置命令        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        //执行命令        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;}

image-20221130152756486

image-20221130153006990

来源地址:https://blog.csdn.net/weixin_60478154/article/details/128117711

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Linux】shell命令行简单解释器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux下执行shell命令方法简介

linux下执行shell命令有两种方法在当前shell中执行shell命令在当前shell中产生一个subshell,在subshell中执行shell命令1.在当前shell中执行shell命令 主要就是在命令行中通过交互方式方式直接输
2022-06-04

简单解读Linux的ls命令

  我们知道在Linux系统中命令参数各种各样,而其中的ls命令则是在Linux中经常被使用到的一个命令,通过ls命令我们可以进行查看Linux文件夹包含的文件、查看文件权限(包括目录、文件夹、文件权限)以及查看目录信息等等操作。那么到底什么是ls命令呢?在本文中编程学习网笔者就简单为大家解读其具体的用法以及实际运用的例子
简单解读Linux的ls命令
2024-04-17

linux修改目录和文件权限的简单命令解释

今天遇到的问题,如何一个用户如www的权限复制给我的用户? 目录的权限表示:dwrxr--r-- 其中第一个字符 d代表目录, -代表字符 w代表可写,r代表可读 x代表可执行 数字为4,2,1其中第一组是文件或者目录所有者权限,第二组代
2022-06-04

shell 命令统计代码行数的简单代码

分享一个统计代码行的shell命令: find . “(” -name “.java” -or -name “.html” -or -name “.js” -or -name “.css” “)” -print | xargs wc
2022-06-04

Shell命令解释器分类示例详解

目录1、命令解释器2、编程语言分类3、Shell脚本执行方式4、应用场景总结Shell命令解释器:介于 系统内核——>命令解释器——>外围应用程序:应用/命令/服务 Shell编程:bash
2023-05-12

Linux Shell 常见的命令行格式简明总结

#在后台执行 cmd 指令cmd & #命令序列. 在同一行执行多个命令cmd1 ; cmd2 #在当前 shell 中以一组的形式执行多个命令{ cmd1 ; cmd2 ; } #在子 shell 中以一组的形式执行多个命令(cmd1 ;
2022-06-04

linux shell命令行参数用法详解

习惯使用linux命令行来管理linux系统,例如: $ date 二 11 23 01:34:58 CST 1999 $用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个字必须是一个
2022-06-04

简单了解Linux性能监控命令free

在系统遇到各种IO瓶颈,内存使用率高,cpu使用率高等问题时,我们如何来定位错误?linux提供了很多命令来协助我们快速定位到错误,free命令是Linux最常用的命令之一:它可以查看系统的内存状况,包括服务器的总内存,已经使用的内存和剩下
2022-06-04

每天一个Linux命令之shell单引号和双引号的经典解释

01 经典解释 单引号:所见即所得 双引号:所见非所得,它会先把变量解析之后,再输出 反引号(``) :命令替换,通常用于把命令输出结果传给入变量中 反斜杠( \ ) :转义字符/逃脱字符,linux如果echo
2022-06-04

Linux中多命令执行';'和'&&'的区别解释

前言 在Linux运维过程中或者日常Linux系统操作过程中会同时执行多条命令,这样的话需要通过我们的多重命令方式进行处理。多命令执行包括';'和'&&'命令,这样shell就可以一次执行多个命令,每个命令之间可用';'和'&&'隔开。 那
2022-06-04

Linux简单命令解决系统性能问题

本篇内容主要讲解“Linux简单命令解决系统性能问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux简单命令解决系统性能问题”吧!一、top 对许多管理员来说,***学会的就是TOP命令
2023-06-16

linux shell命令行选项与参数用法详解

问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。1,直接处理,依次对$1,$2,...,$n进行解析,分别
2022-06-04

详解Linux系统三种模式下的简单命令

i的编辑器: 1、三种模式:底行模式 命令模式 插入模式 命令模式:1、从命令切换插入模式: i : 光标所在左侧输入 I 光标移动到所在行的最左则 o :光标移动的下一行(新的一行) O:光标移动的上一行(新的一行) a
2022-06-04

Linux学堂之Vim编辑器的简单命令使用

  众所周知vi编辑器是Linux和Unix上最基本的文本编辑器,由于不需要图形界面所以vi是效率很高的文本编辑器,而vim作为Vi的加强版更容易使用,所以掌握Vim编辑器的使用方法是非常重要的。为此在本文中编程学习网笔者就为大家介绍Vim编辑器的基本概念和一些简单命令的使用供大家参考参考。    ◎v
Linux学堂之Vim编辑器的简单命令使用
2024-04-17

如何理解linux shell命令行选项与参数用法

这篇文章主要讲解了“如何理解linux shell命令行选项与参数用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解linux shell命令行选项与参数用法”吧!问题描述:在lin
2023-06-09

Linux Shell脚本多命令执行逻辑的示例详解

Linux 中可以使用分号";“、双and号”&&“和双竖线”||"来连接多个命令。根据场景的不同适当的使用合适的符号,感兴趣的小伙伴可以了解一下
2022-11-13

在Linux命令行终端中使用python的简单方法(推荐)

Linux终端中的操作均是使用命令行来进行的。因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来。 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令
2022-06-04

linux shell 解析命令行参数及while getopts用法小结

目录linux shell 解析命令行参数|getpotsgetpotslinux shell 解析命令行参数|getpots demo: #!/bin/bash func() {echo "Usage:"echo "test.sh [-j
2022-06-05

编程热搜

目录