简简单单的一个shell,编程语言:c++,功能长未完善,懂哥可以评论帮助一下。 目前可以正常编译使用。
//Readme
//项目名:LGFShell-Little Gold Fish's Shell
//3239215285@qq.com
//半成品,但能基本使用,如果有懂哥,欢迎来评论区完善
//缺点:没有像其他shell的内置命令,例如cd
//优点:体积小,编译快,运行快,环境不复杂,不使用make也能正常编译
//QAQ区:
//Q1:为什么不直接把string转成char然后用system()函数?
//A1:为了更好的拓展性
//Q2:可以正常使用吗?
//A2:已经实现了其他shell至少50%的功能,要求不过分的话就能使用
//Q3:为什么有那么多被注释掉的代码?
//A3:都是一些模仿shell的功能,但因为有问题,所以先注释掉,懂的人可以自己去摸索并完善功能
//Q4:我看不懂代码该怎么办?
//A4:我已经尽量写了注释来解释代码了,如果还看不懂,可以通过上面的联系方式问作者
//
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
using namespace std;
void recommand(string str);
void runcommand(string str, string parm);
void shell_command(string str, string parm);
int main()
{
/*const char *pw_name;//获取linux用户名
string s1(pw_name, pw_name + strlen(pw_name));*/
string str;
for (;;)
{
char *getcwd(char *buf, size_t size);
//char *getcwd( char *buffer, int maxlen );//获取当前路径
//cout << s1 << "@LGFShell>";
cout << "@LGFShell>";
getline(cin, str);//输入命令
recommand(str);//重新组合命令
}
return 0;
}
void recommand(string str)
{
//该函数将输入的字符分开成命令和参数
string parm;//命令参数
int n1 = 0;
int n2 = 1;
char ch = ' ';
for (;;)
{
if (strstr(str.c_str(), " ") == NULL)//防止输入的命令后面没有空格导致程序进入死循环
break;
if (str[n2] != ch)
{
n1 += 1;
n2 += 1;
}
else
{
parm = str.substr(n1);
str = str.replace(n1, 100, "");
break;
}
}
runcommand(str, parm);//执行命令
}
void runcommand(string str, string parm)
{
/*if (str == "cd"){//响应cd命令
str = str + parm;
const char *c = str.data();
cout << c;
system(c);
return;
}*/
int ret = 0;//声明返回值
str = "/bin/" + str + parm;//合成命令和参数
const char *p = str.data();
ret = system(p);//获取system()函数的返回值
if (ret = 32512)//响应未找到命令的返回值
{
cout << "Command not found, trying to run command as a shell command." << endl;
//shell_command(str, parm);
}
}
|