【问题标题】:Using getenv function使用 getenv 函数
【发布时间】:2011-07-21 02:46:58
【问题描述】:

我有一个 C 程序,它打印每个环境变量,其名称由标准输入给出。 它会打印 $PATH、$USER 等变量,但看不到我在 Linux shell 中定义的环境变量... 例如,在 bash 中我定义 my=4,当我输入“my”时,我希望程序返回 4。

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 的所有继承。 谢谢。。

【问题讨论】:

  • 不需要malloc一个固定长度的块。只需char key[30] 就可以了。 (顺便说一句,你永远不会 free 块。)
  • @larsmans:感谢您的观察,这只是一个匆忙的例子,我需要在更广泛的背景下使用 getenv :)

标签: c shell getenv


【解决方案1】:

有几种方法:

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

这些方法中的每一种都具有相同的效果,但通过不同的机制。

  1. 此方法特定于您正在使用的 shell,尽管它在大多数典型的 shell 中都是这样工作的(Bourne shell 变体;csh 派生的 shell 再次不同)。这首先设置一个shell 变量,然后将其导出到一个环境变量,然后运行您的程序。在某些 shell 上,您可以将其缩写为 export my=4。程序运行后变量保持设置。

  2. 此方法还取决于您的 shell。这会为./program 的执行临时设置my 环境变量。运行后my不存在(或有其原始值)。

  3. 这使用env 程序在运行程序之前设置环境变量。这个方法依赖于任何特定的shell,并且是最可移植的。与方法 2 一样,这会临时设置环境变量。事实上,shell 甚至都不知道my 已设置。

【讨论】:

  • +1:在 1 中,我建议将“最典型的 shell”替换为“Bourne shell 变体”(或“所有可用的 shell”:))
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这与 C 或 getenv 无关。如果你在 shell 中执行my=4,你已经定义了一个本地 shell 变量。要使其成为环境变量,请执行export my

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 2019-05-16
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多