我想使用bash终端在Mac上使用C程序获取修改后的环境变量。我该怎么做?
如果我使用getenv
,我将只获得默认的系统定义环境变量 - 但我没有得到修改后的环境变量。为什么?我该如何纠正这个?
答案 0 :(得分:1)
#include <stdio.h>
int main()
{
setenv("PATH","/mypath",1);
printf("%s\n",getenv("PATH"));
return(0);
}
上述程序输出:
/mypath
但是如果你在C程序之后在bash中执行env,你将获得默认为bash设置的PATH值。
$ env
...
PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user/bin
...
这是因为环境变量仅针对运行C程序的特定进程进行了修改。不适用于运行bash的进程。
修改强>
将env.c写成:
#include <stdio.h>
int main()
{
printf("%s\n",getenv("PATH"));
return(0);
}
接下来是:
$ gcc env.c
$ export PATH=/bin
$ ./a.out
给出:
/bin
我不明白为什么它应该有所不同。 (你做了我上面做过的所有步骤吗?)
答案 1 :(得分:0)
通过使用putenv(), setenv() and unsetenv()
,我们只影响我们调用的当前进程和子进程的环境变量。我们不能影响父进程的环境,它通常是一个shell。
通过使用extern char** environ;
我们无法访问修改后的环境变量,但是
用于添加或修改环境变量的程序可以使用getenv()
函数访问它们。
例如....
#include<stdio.h>
#include<stdlib.h>
main()
{
if(putenv("COLOR=BROWN")==0)
printf("Successful\n");
else
printf("Unsuccessful\n");
//If we put an environment variable it will only VISIBLE THE PROGRAMME BY WHICH IT HAS BEEN set
char *result;
result = getenv("COLOR");//char* getenv(const char*)
if(result!=NULL)//if environment variable does not exist result will be NULL
puts(result);
else
printf("failed to get environment variable\n");
//Modify this environment variable
if(putenv("COLOR=RED")==0)
printf("changing Successful\n");
else
printf("Unsuccessful\n");
result = getenv("COLOR");
if(result!=NULL)
puts(result);
else
printf("failed to get environment variable\n");
//Verify with existing env variables
if(putenv("PWD=NONE")==0)
printf("changing Successful\n");
else
printf("Unsuccessful\n");
result = getenv("PWD");
if(result!=NULL)
puts(result);
else
printf("failed to get environment variable\n");
}
答案 2 :(得分:0)
试试这个:
#include <stdio.h>
main(int *a, char *b[], char *c[])
{
int ctr;
for (ctr = 0; c[ctr]; ctr++)
{
printf("%s\n", c[ctr]);
}
return 0;
}