用c++制作shell,尝试创建shell变量
Making a shell in c++, trying to create shell variables
所以我有一个相对简单的shell,它处理管道、chdir、重定向和运行程序。但我需要一种实现shell变量的方法,就像在普通shell中一样(例如HELLO=world(。
int main()
{
while(true)
{
string result;
char * left[128];
char * right[128];
cout << "$$ ";
char command[128];
cin.getline(command,128);
if(strlen(command) != 0)
{
vector<char*>args;
char* prog = strtok(command, " ");
char* tmp = prog;
while ( tmp != NULL )
{
args.push_back( tmp );
tmp = strtok( NULL, " " );
}
char** argv = new char*[args.size()+1];
for ( int k = 0; k < args.size(); k++ )
{
argv[k] = args[k];
}
argv[args.size()] = NULL;
if ( strcmp( command, "exit" ) == 0 )
{
return 0;
}
if(!strcmp(prog,"cd"))
{
chdir(argv);
}
if(prog[0] == '.')
{
std::system(args[0]);
}
else
{
pid_t kidpid = fork();
if(kidpid < 0)
{
perror("Could not fork");
return -1;
}
else if (kidpid == 0)
{
execvp(prog,argv);
}
else
{
if(waitpid(kidpid,0,0) <0 )
{
return -1;
}
}
}
}
}
return 0;
}
这是最简单形式的shell,函数调用几乎按照它们所说的执行。
您需要3样东西:
- 分析输入行中的
FOO=foo
变量赋值 - 分析输入行中的
$FOO
变量引用,替换为值 - 变量名称和值的存储
如何做后者有无限的可能性。
- 单个动态字符数组,所有变量存储在一个字符串中,您可以选择一个神奇的字符来分隔条目:
FOO=foo#BAR=baz#SPAM=eggs
。根据条目数量缩放O(n( - 包含变量名和值的成对字符指针的动态数组。缩放O(n(
- 链表,您可以在其中以排序的方式插入以上对。如果使用二进制搜索进行插入和查找,则缩放O(logn(
- 上述对的二叉树,如果不平衡,则在O(logn(和O(n(之间缩放
- 哈希表。刻度O(1(
- 等等
对于动态数组,我的意思是在插入时总是realloc
。
如果您想将变量存储在shell中,您应该查看stdlib中的getenv((和setenv(。
http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
这样就避免了在带有STL的C/C++程序中使用存储。例如,您可以通过设置变量
setenv("variablename", "value", 1);
其中,如果当前变量存在,则1将启用覆盖。因此,在您的示例中,我们将使用
setenv("HELLO", "world", 1);
您还可以使用检索变量的值
char *value = getenv("variablename");
您不需要动态分配值。
注意:这些值将在模拟shell的程序的生命周期中持续存在,之后这些值将不复存在。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何通过cpp程序运行shell脚本
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 在 Xcode 中创建一个新的"Shell Tool"目标以供使用 Google 测试
- 正在创建C++程序以运行shell脚本
- 如何创建一个将命令行参数传递给shell脚本的c++程序
- Unix中的c++ Shell, execv:从函数动态创建并返回一个可用的第二个参数
- 如何在C/ c++中创建一个微shell
- 用c++制作shell,尝试创建shell变量