在 C 中设置环境变量

新手上路,请多包涵

有没有办法使用 C 在 Linux 中设置环境变量?

我试过 setenv()putenv() ,但它们似乎对我不起作用。

原文由 iman453 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 825
2 个回答

我在这里做一个疯狂的猜测,但是这些函数似乎不起作用的正常原因不是因为它们不起作用,而是因为用户并不真正了解环境变量是如何工作的。例如,如果我有这个程序:

 int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

然后我从 shell 运行它,它不会修改 shell 的环境——子进程无法做到这一点。这就是为什么修改环境的 shell 命令是内置的,以及为什么需要 source 一个包含要添加到 shell 的变量设置的脚本,而不是简单地运行它。

原文由 Carl Norum 发布,翻译遵循 CC BY-SA 2.5 许可协议

任何 unix 程序都在与启动它的进程不同的进程中运行;这是一个“子”过程。

当一个程序启动时——无论是在命令行还是任何其他方式——系统都会创建一个新进程,它(或多或少)是父进程的副本。该副本包括父进程中的环境变量,这是子进程“继承”其父进程的环境变量的机制。 (这主要是这里其他答案所说的)

也就是说,进程 设置 自己的 环境变量。

其他人提到采购 shell 脚本,作为在当前进程中设置环境变量的一种方式,但是如果您需要以编程方式在当前(shell)进程中设置变量,那么有一种稍微间接的方式是可能的。

考虑一下:

 % cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
    int i;
    for (i=1; i<argc; i++) {
        printf("ENV%d=%s\n", i, argv[i]);
    }
}
% echo $ENV1

% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
%

内置的 eval 评估其参数,就好像该参数是在 shell 提示符下键入的一样。这是一个 sh 风格的例子; csh 风格的变体留作练习!

原文由 Norman Gray 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题