所以我有一个相对简单的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,函数调用几乎就是他们所说的。
答案 0 :(得分:2)
你需要3件事:
FOO=foo
变量赋值$FOO
个变量引用,替换为值如何做后者有无穷无尽的可能性。
FOO=foo#BAR=baz#SPAM=eggs
。使用条目数来缩放O(n)。使用动态数组,我的意思是你在插入时总是realloc
。
答案 1 :(得分:1)
如果要将变量存储在shell中,应该查看stdlib中的getenv()和setenv()。
http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html http://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的程序的生命周期内持续存在,之后它们不再存在。