文章目录
在Linux系统下咱们都是经过在命令行敲击一些命令来实现一些咱们想要的操做,只要了解一些进程程序替换的知识,咱们也能够本身写一个简易的shell。
#什么是shell 脚本c++
最简单的解释,一个shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,而后执行文件中的全部命令,就好像这些命令已经直接被输入到了命令行中同样。
Shell 有些独特,由于它不只是一个功能强大的命令行接口, 也是一个脚本语言解释器。咱们将会看到,大多数可以在命令行中完成的任务也可以用脚原本实现,一样地,大多数能用脚本实现的操做也可以在命令行中完成。
因为能力有限,在这里只能实现一个很简单的命令行脚本,并且...bug不少:好比说之间按回车键会出现死循环,好比说第一个字符串不是正确的命令时也不会报错,可是若是是第二个日后的字符串是错误的就会报错....(很神奇,我也不知道为何...还望各路大佬多多指教~)
#怎样编写一个shell 脚本
1.获取命令行
2.解析命令行
3.创建一个子进程
4.替换子进程(execvp)
5.父进程等待子进程(wait)web
#代码shell
#include
#include
#include
#include
#include
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;
}