我要为我的项目用 C 语言编写一个简单的 shell,它可以实现环境变量。我查看了如何使用 getenv、setenv、putenv。到目前为止一切顺利,我尝试使用 getenv 来显示 shell 变量……嗯……取得了一些成功。但我有一种感觉,我的推理是有缺陷的。我有一个char** argv
包含来自用户输入的解析输入。我现在检查是否argv
以命令“echo”开头,然后检查以下任何输入是否以$
符号开头。这是我的代码:
int executeVariables(char** arguments){
int i = 0;
if(strcmp(arguments[i], "echo") == 0){
char *variable;
for(i = 1; arguments[i] != NULL; i++){
char *str = arguments[i];
if( *(str + 0) == '$'){
variable = getenv(str + 1);
}else{
variable = getenv(str);
}
if(!variable){
//puts("not a variable");
printf("%s ", arguments[i]);
}else{
//puts("a variable");
printf("%s ", variable);
}
}
printf("\n");
exit(0);
}
return 1;
}
我认为普通的 linux shell 会找到$
符号,它会在调用 echo 命令之前扩展变量。我的 shell 没有遵循这个原则,它在 echo 命令本身内扩展变量。关于如何实现这一点的任何想法?谢谢。
编辑:
我遇到的一个问题是:echo $HOME
并且echo HOME
给了我相同的结果,这是错误的。
编辑:
经过各种测试,一切正常。但要真正测试它,我需要创建一个局部变量,然后是echo
这个值。我尝试使用putenv
函数,但它没有创建局部变量。
i = 0;
char** temp = malloc(sizeof (*temp));
if(strstr(userInput, "=") != NULL){
//puts("we got equals");
puts(userInput);
if(putenv(userInput) == 0){
printf("doing putenv(%s)\n", userInput);
exit(0);
}
else{
puts("couldnt putenv");
exit(1);
}
}
userInput:char *userInput
是使用从命令行获得的输入fgets()