【问题标题】:How to set an environment variable when using system() to execute a command?使用 system() 执行命令时如何设置环境变量?
【发布时间】:2014-06-01 11:09:27
【问题描述】:

我在Linux上写一个C程序,需要用system()执行一个命令,在执行那个命令的时候需要设置一个环境变量,但是不知道用@的时候怎么设置env var 987654322@.

【问题讨论】:

  • system("var=val cmd") 不行吗?
  • system 的参数只是一个 shell 命令行。因此,您可以像在 shell 中一样设置它。
  • $EXAMPLE=test env|grepEXAMPLE -->EXAMPLE=test --> 这似乎在 shell 中工作...

标签: c linux system


【解决方案1】:

如果要将环境变量传递给与父进程不同的子进程,可以使用getenvsetenv 的组合。假设您想将不同的PATH 传递给您的孩子:

#include <stdlib.h>
#include <string.h>

int main() {
    char *oldenv = strdup(getenv("PATH")); // Make a copy of your PATH
    setenv("PATH", "hello", 1); // Overwrite it

    system("echo $PATH"); // Outputs "hello"

    setenv("PATH", oldenv, 1); // Restore old PATH
    free(oldenv); // Don't forget to free!

    system("echo $PATH"); // Outputs your actual PATH
}

否则,如果你只是创建一个新的环境变量,你可以使用setenvunsetenv的组合,像这样:

int main() {
    setenv("SOMEVAR", "hello", 1); // Create environment variable
    system("echo $SOMEVAR"); // Outputs "hello"
    unsetenv("SOMEVAR"); // Clear that variable (optional)
}

当然,不要忘记检查错误代码。

【讨论】:

    【解决方案2】:

    这应该可行:

    #include "stdio.h"
    
    int main()
    {
        system("EXAMPLE=test env|grep EXAMPLE");
    }
    

    输出

    示例=测试

    【讨论】:

    • 我喜欢这种方法,因为它不会破坏父级中的现有环境(即如果您多次调用system(),您可能想要定义各种变量但可能看不到您定义的变量对于其他呼叫中的给定呼叫!)
    • 这不适用于 Pre-POSIX Bourne shell
    【解决方案3】:

    在Linux中使用setenv() api设置环境变量

    #include <stdlib.h>  
    int setenv(const char *envname, const char *envval, int overwrite);
    

    请参阅http://www.manpagez.com/man/3/setenv/ 了解更多信息。

    使用setenv()设置环境变量后,使用system()执行任何命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 2021-09-27
      • 1970-01-01
      • 2011-04-04
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多