文章目录
在Linux系统下我们都是通过在命令行敲击一些命令来实现一些我们想要的操作,只要了解一些进程程序替换的知识,我们也可以自己写一个简易的shell。
#什么是shell 脚本
最简单的解释,一个shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,然后执行文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。
Shell 有些独特,因为它不仅是一个功能强大的命令行接口, 也是一个脚本语言解释器。我们将会看到,大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够在命令行中完成。
由于能力有限,在这里只能实现一个很简单的命令行脚本,而且...bug很多:比如说之间按回车键会出现死循环,比如说第一个字符串不是正确的命令时也不会报错,但是如果是第二个往后的字符串是错误的就会报错....(很神奇,我也不知道为什么...还望各路大佬多多指教~)
#怎样编写一个shell 脚本
1.获取命令行
2.解析命令行
3.建立一个子进程
4.替换子进程(execvp)
5.父进程等待子进程(wait)
#代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
int argc=0;
char*argv[32];
//获取命令行字符串
int param_parse(char* buff)
{
if(buff==NULL){
return -1;
}
char* ptr=buff;
char* tmp=ptr;
while((*ptr)!='\0'){
//当遇到空格,并且下一个位置不是空格的时候
//将空格位置置为'\0'
//用argv[argc]来保存这个字符串的位置
if(*ptr==' '&&*(ptr+1)!=' '){
tmp=ptr+1;
}
ptr++;
}
argv[argc++]=tmp;
argv[argc]=NULL;
return 0;
}
函数替换
int exec_cmd()
{
int pid=0;
pid=fork();
if(pid<0){
return -1;
}else if(pid==0){
execvp(argv[0],argv);
exit(0);
}
int statu;
wait(&statu);
//判断子进程是否是代码运行完毕退出
if(WIFEXITED(statu)){
//获取到子进程的退出码,转换为文本信息打印
printf("%s\n",strerror(WEXITSTATUS(statu)));
}
return 0;
}
int main()
{
while(1){
printf("MyShell>");
char buff[1024]={0};
//%[^\n]获取数据直到遇到\n为止
//%*c 清空缓冲区,数据都不要了
scanf("%[^\n]%*c",buff);
printf("%s\n",buff);
argc=0;
memset(argv,0,sizeof(argv));
param_parse(buff);
exec_cmd();
}
return 0;
}