2015-11-05 54 views
0

我想知道是否可以从C程序中设置shell的HOME和PATH环境变量?在C中设置shell的PATH和HOME环境变量

我有存储在字符串中的HOME和PATH值,但我无法弄清楚如何让壳看到这一点。我试图使用putenv函数,但我无法得到这个工作。

这是我尝试设置PATH的代码。我从另一个文件读取PATH值。

//Find and store path value 
    fseek(fp, 5, SEEK_SET); 
    fread(path, 28, 1, fp); 
    char *varpath = path; 
    ret = putenv(varpath); 

在此先感谢!

+0

添加已到目前为止已经试过你的问题的代码。 –

+0

当然,我刚刚做到了这一点:) – user3314680

+0

嘿,对不起,我应该更清楚。我的C程序创建一个shell。例如,在我运行我的程序之前,我可以键入echo $ PATH,它会显示我的路径。当我运行我的C程序时,我需要回显$ PATH说明某个结果。 – user3314680

回答

2

子进程无法为其父进程设置环境变量。

当你运行一个C程序并调用从内它setenvputenv,功能改变的C程序和它的孩子们的环境变量 - 而不是从C程序被运行父shell。

所以,你可以使用source命令或类似的内壳,以改变该程序的环境或使用forkexec从一个C程序作为其子运行shell。

+0

谢谢你。我使用fork和exec来执行其他命令,例如ls。你对我如何使用它来改变HOME和PATH变量有粗略的想法吗? – user3314680

+0

就像你这样做,使用'putenv'然后使用fork + exec并且在子进程中设置HOME和PATH,当然如果它们不是由它自己调用'putenv'。 – fghj

0

我已经在.NET中完成了这项工作,但不是C++,所以我没有确切的代码,但希望这会指向正确的方向......正如您在上次评论中澄清的那样,您正试图设置env子进程中的变量,而不是父进程,所以这是可行的。

而不仅仅是一个常规的ShellExecute,创建一个子进程并维护对STDIN,STDOUT,STDERR句柄的引用。子进程应该启动CMD.EXE。成功开始后,只需将一系列SET {name} = {value} {newline}序列传递到您的STDIN流。

环境设置完成后,将要执行的实际命令传递给STDIN流。

这里是CreateProcess的一些信息:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx

和.NET版本的情况下,它有助于看看:https://msdn.microsoft.com/en-us/library/0w4h05yb(v=vs.110).aspx

0

的一种方式,一个程序可以用来设置环境变量,有程序编写命令将由调用程序的shell执行。 resize程序旨在为LINESCOLUMNS执行此操作:

$ resize -u> foo 。 ./foo

其中foo包含

COLUMNS=80; 
LINES=40; 
export COLUMNS LINES; 

我做了PATH类似的东西在一个名为newpath程序,例如,

export PATH=$(newpath)