C++ 从C++;

C++ 从C++;,c++,shell,scripting,C++,Shell,Scripting,这个shell脚本 #!/bin/csh set VAR=12345 echo $VAR 将在shell上和平地给出输出12345。 我需要使用C++在代码的某个部分中做同样的操作: string str = "12345"; retValue="set var1= "+str; system(retValue1.c_str()); system("echo $var1"); 这不会创建系统变量var1和echos null,这是可以理解的,因为每个系统函数都会创建一个具有不同环

这个shell脚本

#!/bin/csh
set VAR=12345
echo $VAR
将在shell上和平地给出输出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++建立系统变量。 提前多谢

您可以使用
putenv()

使用
setenv()
,可以复制输入,并且在调用
setenv()
后可以安全地处理字符串

#包括
setenv(“VAR”,“12345”,真);

您想要的函数可能是
putenv()
。您没有指定所使用的操作系统,因此我将假定为Linux,因为这是我手边的手册页:

int putenv(字符*字符串)

函数的作用是:添加或更改环境的值 变量。参数字符串的格式为name=value。如果名称 环境中不存在,则字符串将添加到 环境如果名称确实存在,则 环境更改为值。字符串指向的字符串 成为环境的一部分,因此更改字符串会更改 环境


IIRC,win32上也有一个putenv。最后,你可以试着看看你基本上做不到的

您可以在您自己的进程和所有未来子进程中调用以更改环境变量,但是没有办法更改父shell进程的环境


<>你可以使用C++程序,例如它将用户输出的一些shell命令(或代码> EVA/COD>-ED)输出。一个例子是:代码> SSH代理-s//>代码> < /P> < P>以上回答正确地解释了如何从C++程序中设置环境变量,基本上是代码> SENEN()< <代码> < /P> 我想说的另一点是,为什么你的方法不起作用?原因是,当加载进程时,
system
命令将加载新的上下文,这相当于一个新的shell。实际上,您的环境变量正在设置中,但当您重新设置时,它将丢失

参考这个


实际上,
setenv()
设置父进程的env变量!这就是为什么它对你有用

注意,在
标题中可用的函数中,其他优秀的函数似乎没有提到
setenv
,只有
getenv
。这可能不是问题,因为我可以在带有GCC 9.1的Centos 7系统上使用
\include
-ing
。我怀疑在大多数情况下
只是
的一个薄薄的包装


另一件需要注意的小事情是,
setenv
接受C样式的字符参数(也用于设置环境变量的值)。如果使用C++字符串(如您所需),不要忘记使用它们的 .cScript()/Cux>方法转换它们。 我认为他想更改父shell中的环境变量,这是不可能的。。。。请看我的回答原始海报的示例是一个
系统(“set X=foo”)
,它不能像他期望的那样工作。。。。我对否决票和其他答案感到惊讶。Linux程序无法强制更改父shell(如果有的话)的环境。您100%确定海报想要这样做吗?想编写一个C++程序来复制shell中的<>代码>设置>代码>,这将是很奇怪的。也许问题在于
系统(“set X=Y”)
启动了另一个进程,因此更改在结束时丢失。也许海报实际上想要改变当前流程的环境。顺便说一句,我不是你们的反对者。事实上,海报对我的回答的评论似乎证实了我的怀疑,但我确实认为这里有很大的混乱空间!!很好,听到这个消息我很高兴。请记住接受其中一个答案。具体来说,如果您调用putenv(v),其中v是一个自动变量,然后从函数返回,那么环境就会崩溃。不要使用putenv。始终使用setenv.+1来使用正确的函数。其他几个答案建议使用putenv,但不应使用putenv。setenv是一个更好的接口。特别是,变量为自动变量的putenv(var)通常会有意外行为。@Williampersell您能详细说明为什么不使用putenv()吗?奇怪的是,手册页说得最好:
字符串指向的字符串成为环境的一部分。程序不应更改或释放字符串,也不应使用堆栈或其他瞬态字符串变量作为putenv()的参数。setenv()函数明显优于putenv()。
setenv应优于putenv。
setenv()
修改调用进程的环境
#include <cstdlib>
...
putenv("VAR=12345");
#include <cstdlib>
...
setenv("VAR", "12345", true);
#include <cstdlib>

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