【问题标题】:Implementing environment variables in simple linux shell在简单的 linux shell 中实现环境变量
【发布时间】:2011-11-27 23:30:07
【问题描述】:

我要在 linux 中编写一个简单的 shell,它可以实现包括环境变量在内的各种东西。我尝试使用getenv 打印这些变量,但我遇到了一些问题。 getenv 始终返回 NULL,即使用户键入了正确的变量,例如 $HOME。这是我的代码

int i = 0;
if(strcmp(cmdArgv[i], "echo") == 0){
                char *variable;
                for(i = 1; cmdArgv[i] != NULL; i++){
                    variable = getenv(cmdArgv[i]);
                    if(!variable){
                        puts("not a variable");
                           printf("%s ", cmdArgv[i]);
                        }else{
                            puts("a variable");
                            printf("%s ", variable);
                        }
                   }
                   printf("\n");
                   exit(0);
               }

它不进入else 条件。例如,如果用户键入 echo ls $HOME。此输入被解析为cmdArgv,即char **。那么我的输出是

not a variable
ls
not a variable
$HOME

但是$HOME 是一个变量,所以我对getenv 的实现可能不正确。关于似乎是什么问题的任何想法?谢谢。

【问题讨论】:

    标签: c linux shell environment-variables getenv


    【解决方案1】:

    变量名为HOME,而不是$HOME。 (后者是你的 shell 用于扩展变量的语法。)

    【讨论】:

    • 只是让它更明显一点:getenv() 接受不带 $ 符号的环境变量。
    • @kerrek 哦,是的......你是对的。我必须 putenv VAR 才能使 $VAR 成为一个变量。我混合了拥有$ 标志和没有它的概念。看到这个我觉得好傻。谢谢。
    • @Ram:感谢您的意见。我现在明白了
    • 我还有一个问题。为什么在linux终端输入echo $HOME时,它仍然把它当成HOME变量?
    • @mkab '我必须 putenv VAR 才能使 $VAR 成为一个变量' -- 不,如果你 putenv("VAR=foo"),那么 getenv("VAR") 将返回“富”。 '$' 同样是 shell 语法。当您在命令行某处(单引号之外)键入 $VAR 时,您是在告诉 shell 用 getenv("VAR") 替换它。
    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多