从C ++设置系统变量

时间:2011-11-23 14:04:14

标签: c++ shell scripting

这个shell脚本

#!/bin/csh
set VAR=12345
echo $VAR

将和平地给出输出12345。 我需要使用C ++在代码的某些部分执行相同的操作:

string str = "12345";
retValue="set var1= "+str;      
system(retValue1.c_str());
system("echo $var1");

这不会创建系统变量var1和echos null,这是可以理解的,因为每个系统函数都会创建具有不同环境变量的子进程。所以我只使用一个系统函数将它们组合如下......但它再次回显为null。

retValue="set var1= "+str;
retValue1=retValue+";\n echo $var1";
system(retValue1.c_str());

有人可以指导我通过C ++设置系统变量。 非常感谢提前!

6 个答案:

答案 0 :(得分:10)

查看<cstdlib>中的setenv

#include <cstdlib>

setenv("VAR", "12345", true);

答案 1 :(得分:1)

您可以使用putenv()

#include <cstdlib>
...
putenv("VAR=12345");

这非常方便,但putenv不会复制字符串。这意味着如果稍后修改它,则修改环境。这不是文字的问题,但使用std::string形成字符串的方式与putenv()不兼容。

另一种方法是使用setenv()

#include <cstdlib>
...
setenv("VAR", "12345", true);

使用setenv(),输入的副本就可以在调用setenv()后安全地处理字符串。

答案 2 :(得分:0)

您想要的功能可能是putenv()。你没有指定你所使用的操作系统,所以我会假设Linux,因为那是我方便的手册页:

  

int putenv(char * string);

     

putenv()函数添加或更改环境的值   变量。参数字符串的格式为name = value。如果名字   在环境中尚不存在,然后将字符串添加到   环境。如果name确实存在,那么name中的值   环境变为价值。字符串指向的字符串   成为环境的一部分,所以改变字符串会改变   环境。

IIRC,win32上还有一个putenv。最后,您可以尝试查看this question, possibly a dup

答案 3 :(得分:0)

你基本上不能这样做。

您可以在您自己的流程和所有未来的子流程中调用putenv 更改环境变量,但没办法(这很好)更改 shell进程的环境

您可以使用C ++程序的使用约定,例如:它输出一些shell命令,由用户输出(或eval - ed)。一个例子是ssh-agent -s

答案 4 :(得分:0)

以上答案正确解释了如何从C ++程序设置环境变量,该程序基本上是setenv()

我想要做的唯一另一点是为什么你的方法不起作用?原因是,当加载进程时,system命令加载了新的上下文 - 相当于一个新的shell。实际上你的环境变量已经设置了,但是当你回来时它就会丢失。

请参阅此http://pubs.opengroup.org/onlinepubs/007904975/functions/setenv.html

事实上,setenv()设置了进程的env变量!这就是为什么它适合你。

答案 5 :(得分:0)

请注意,在setenv标头中可用的功能中,本来不错的CPPreference site似乎没有提到<cstdlib>,只有getenv。不过,这可能不是问题,因为我可以在具有GCC 9.1的Centos 7系统上通过setenv-ing #include使用<cstdlib>。我怀疑在大多数情况下,<cstdlib>只是<stdlib.h>周围的薄包装。

还有一点需要注意的是,setenv采用C样式字符参数(也用于设置环境变量的 value )。如果您按需使用C ++字符串,请不要忘记使用其.c_str()方法对其进行转换。