2011-03-23 86 views
2

我有一个C程序打印每个环境变量,其名称由标准输入。 它打印变量,如$ PATH,$ USER但它看不到我在Linux shell中定义自己的环境变量...例如,在bash中,我定义了my = 4,并且我期望程序返回4当我提供输入“我的”。使用getenv函数

int main () { 
    char * key = (char *)malloc(30); 

    scanf("%s", key); 

    if(getenv(key) != NULL) 
    printf("%s\n", getenv(key)); 
    else 
    printf("NULL\n"); 

    return 0; 
} 

我该怎么做才能改善getenv的结果? 我希望它向我展示所有环境变量以及来自Linux shell的所有继承。 谢谢..

+2

不需要'malloc'固定长度块。只要'char key [30]'就可以。 (你从来没有'免费'的块,顺便说一句) – 2011-03-23 08:12:27

+0

@larsmans:谢谢你的观察,这只是一个匆忙的例子,我需要在更广泛的背景下getenv :) – shaku 2011-03-25 15:41:30

回答

5

有几个途径:通过不同的机制

  1. my=4; export my; ./program
  2. my=4 ./program
  3. env my=4 ./program

每一种方法都有同样的效果,但。

  1. 这种方法是特定于您正在使用的外壳,但它是这样工作在最典型的壳(Bourne shell的变种; CSH衍生弹再次是不同的)。首先设置一个shell变量,然后将其导出到环境变量,然后运行您的程序。在某些炮弹上,可以将其缩写为export my=4。程序运行后变量保持设置状态。

  2. 该方法也依赖于你的shell。这为./program的执行设置了my环境变量临时。运行后,my不存在(或具有其原始值)。

  3. 这使用env程序在运行程序之前设置环境变量。这种方法是而不是依赖于任何特定的外壳,并且是最便携的。像方法2一样,这会临时设置环境变量。事实上,外壳从来不知道my已经设置。

+1

+1:1,我建议更换“最典型壳“与”Bourne shell变体“(或”所有可用的壳“:)) – 2011-03-23 10:11:01

2

如果你没有export那么它只是一个shell变量,而不是一个环境变量。使用export my=4my=4; export my

1

这与C或getenv无关。如果在shell中执行my=4,则已定义一个本地shell变量。要制作一个环境变量,请执行export my