> 技术文档 > 【Linux】——简易版SHELL实现_shell的实现

【Linux】——简易版SHELL实现_shell的实现


目录

一、前言

二、SHELL实现

1.获取命令行,实现交互

设置打印格式

获取键盘输入

2.分隔子串,解析命令行

3.指令的判断

4.普通命令的执行

三、全部代码

四、结语


一、前言

在前面的几篇文章中,我们已经讲解了进程的几乎全部内容了,关于一些细节部分博主会在后面的文章中再为大家继续介绍。今天,我们就利用之前所学,来实现一个简易版的SHELL,希望大家能够从中有所收获,如有不足,欢迎指出!!!

二、SHELL实现

1.获取命令行,实现交互

实现我们SHELL的第一步就是能够从键盘上获取用户的输入,即命令行。

设置打印格式

 #define LEFT \"[\" #define RIGHT \"]\" #define LABLE \"#\" int quit=0; char commandline[LINE_SIZE]; char pwd[LINE_SIZE]; //获取用户名 const char *getusername() { return getenv(\"USER\"); } //获取主机名 const char *gethostname() { return getenv(\"HOSTNAME\"); }  //获取当前进程所处路径 void getpwd() { getcwd(pwd,sizeof(pwd)); } //设置打印格式 printf(LEFT\"%s@%s %s\"RIGHT\"\"LABLE\" \",getusername(),gethostname(),pwd); 

获取键盘输入

在获取键盘输入的函数有很多,我们这里仅仅以fget()函数为例,除此之外我们还需要定义一个字符数组来存储fget读到的命令行参数,这里有个要注意的细节就是我们要将读到字符串的\'\\n\'换成\'\\0\',因为fget默认是以换行作为分隔符,但是因此读到的字符串会包括换行符,但这个并不是我们的命令输入,所以要替换成\'\\0\'

#define LINE_SIZE 1024char commandline[LINE_SIZE]; void interact(char* cline,int size) { getpwd(); printf(LEFT\"%s@%s %s\"RIGHT\"\"LABLE\" \",getusername(),gethostname(),pwd); char *s=fgets(cline,size,stdin); assert(s); (void)s; cline[strlen(cline)-1]=\'\\0\'; }

到这里为止,对于命令行参数的获取就完成了,我们可以加上一行打印来验证格式和读取是否正确,由于我们的SHELL进程是一直读取用户的输入的,因此我们设置为循环的形式

 int quit=0; void interact(char* cline,int size) { getpwd(); printf(LEFT\"%s@%s %s\"RIGHT\"\"LABLE\" \",getusername(),gethostname(),pwd); char *s=fgets(cline,size,stdin); assert(s); (void)s; cline[strlen(cline)-1]=\'\\0\'; if(s) printf(\"echo : %s\\n\",cline); } int main() {