在 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 程序并从其中调用 setenv
或 putenv
时,这些函数会更改 C 程序及其子程序的环境变量——而不是父程序 shell C 程序来自 运行.
因此您可以在 shell 中使用 source
命令或类似命令来更改程序的环境或使用 fork
和 exec
到 运行 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
程序旨在为 LINES
和 COLUMNS
执行此操作:
$ 调整大小 -u >foo
. ./foo
其中 foo 包含
COLUMNS=80;
LINES=40;
export COLUMNS LINES;
我在名为 newpath
的程序中对 PATH
做了类似的事情,例如
export PATH=$(newpath)
我想知道是否可以从 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 程序并从其中调用 setenv
或 putenv
时,这些函数会更改 C 程序及其子程序的环境变量——而不是父程序 shell C 程序来自 运行.
因此您可以在 shell 中使用 source
命令或类似命令来更改程序的环境或使用 fork
和 exec
到 运行 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
程序旨在为 LINES
和 COLUMNS
执行此操作:
$ 调整大小 -u >foo . ./foo
其中 foo 包含
COLUMNS=80;
LINES=40;
export COLUMNS LINES;
我在名为 newpath
的程序中对 PATH
做了类似的事情,例如
export PATH=$(newpath)