我在这里写了一个 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/