【Linux】——简易版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读到的命令行参数,这里有个要注意的细节就是我们要将读到字符串的' '换成' ',因为fget默认是以换行作为分隔符,但是因此读到的字符串会包括换行符,但这个并不是我们的命令输入,所以要替换成' '
#define LINE_SIZE 1024
char 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]=' ';
}
到这里为止,对于命令行参数的获取就完成了,我们可以加上一行打印来验证格式和读取是否正确,由于我们的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]='