c - 使用C代码获取环境变量

标签 c linux embedded

我在这里写了一个 C 程序,它使用 system 调用来执行 hi.sh 文件。

这里我使用了。 ./hi.sh 所以我想在同一个shell中执行这个脚本 然后尝试使用 getenv 函数获取环境变量,但这里我得到的输出与我预期的不同。

hi.sh 文件包含

export TEST=10
return

意味着当我使用系统调用运行此 hi.sh 文件时,其 export TEST 在同一 shell 中将值设置为 10。 在此之后,我试图获取此变量值但它给定的 NULL 值。

如果我从控制台手动运行此脚本,如 。 ./hi.sh 然后它工作正常,我使用 getenv("TEST") 函数获得 TEST 的 10 个值。

代码:

#include <stdio.h>
int main()
{
    system(". ./hi.sh");
    char *errcode;
    char *env = "TEST";
    int errCode;    
    errcode = getenv(env);
    printf("Value is = %s\n",errcode);
    if (errcode != NULL) {
        errCode =atoi(errcode);
        printf("Value is = %d\n",errCode);
    }
}

输出:

Value is = (null)

如何在程序 shell 中导出 TEST 变量?如果 system() 在不同的 shell 中执行命令,那么我如何使用 C 程序代码获取由通过 system() 调用调用的 shell 导出的环境变量?

最佳答案

子进程不能直接设置父进程的环境。使用 system() 的方法和 getenv()因此注定要失败。

如果您尝试导入由脚本 hi.sh 设置的选定变量,那么您有几个选择。您可以阅读脚本 hi.sh 并计算出它将它们设置为什么(相当困难),或者您可以运行脚本并让您运行的代码报告感兴趣的环境变量.

假设 hi.sh 设置了 $ENV1$ENV2。您可以使用 popen()将值返回给您的程序,然后 setenv()设置程序的环境。概述:

FILE *fp = popen(". ./hi.sh; echo ENV1=$ENV1; echo ENV2=$ENV2", "r");

while (fgets(buffer, sizeof(buffer), fp) != 0)
{
    ...split the buffer into env_name, env_value...
    setenv(env_name, env_value);
}

pclose(fp);

请注意,我在回显信息中包含了变量名称;这简化了生活。如果你的变量列表变得笨拙,也许你运行 "../hi.sh; env" 来获取整个环境,然后读取每一行并从你的内置列表中计算出它是否您要使用或不使用的变量设置。或者您可以简单地重新设置整个环境,如果您愿意的话。您应该检查 setenv() 函数是否成功(成功时返回零)。您还应该检查 popen() 是否成功 (fp != 0)。在这种情况下,您可能可以使用 strtok()寻找 = 将变量名与值分开;它在 = 上践踏了一个空字节,为您提供了一个空终止名称和一个空终止值:

    char *env_name = strtok(buffer, "=");
    char *env_value = buffer + strlen(env_name) + 1;
    if (setenv(env_name, env_value) != 0)
        ...report trouble...

关于c - 使用C代码获取环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9990214/

相关文章:

c - float 组的总和返回不同的结果

linux - 比较多个文本文件中的行数

linux - pi3 类似设备上的 WLan0 连接[yocto]

c - ATSAM4s8b,如何等待 USB 设备连接

linux - PPP 连接问题嵌入式 linux

c++ - 如何获取给定 HWND 的工具提示文本?

c# - 相当于 mono_string_to_utf8() 没有分配和数据复制

c - 使用 libcurl 在 C 中进行 JSON 请求

linux - 从 shell 脚本中的另一个文件读取命令?

sqlite - 这是SQLite的合理目标负载吗?