在 C 中设置 shell 的 PATH 和 HOME 环境变量

Setting PATH and HOME environment variables of a shell in C

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

我将 HOME 和 PATH 值都存储在字符串中,但我不知道如何让 shell 看到它。我尝试使用 putenv 函数,但无法正常工作。

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

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

提前致谢!

子进程不能为其父进程设置环境变量。

当您 运行 一个 C 程序并从其中调用 setenvputenv 时,这些函数会更改 C 程序及其子程序的环境变量——而不是父程序 shell C 程序来自 运行.

因此您可以在 shell 中使用 source 命令或类似命令来更改程序的环境或使用 forkexec 到 运行 shell 来自 C 程序作为它的子程序。

我是在 .NET 中完成的,但不是在 C++ 中完成的,所以我没有确切的代码,但希望这能为您指明正确的方向...正如您在上一条评论中澄清的那样,您正在尝试设置子进程中的 env 变量,而不是父进程,所以这是可行的。

创建子进程并维护对 STDIN、STDOUT、STDERR 句柄的引用,而不只是常规的 ShellExecute。子进程应该启动 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

程序可用于设置环境变量的一种方法是让程序编写命令,这些命令将由调用程序的 shell 执行。 resize 程序旨在为 LINESCOLUMNS 执行此操作:

$ 调整大小 -u >foo . ./foo

其中 foo 包含

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

我在名为 newpath 的程序中对 PATH 做了类似的事情,例如

export PATH=$(newpath)