这个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 ++设置系统变量。 非常感谢提前!
答案 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,因为那是我方便的手册页:
IIRC,win32上还有一个putenv。最后,您可以尝试查看this question, possibly a dupint putenv(char * string);
putenv()函数添加或更改环境的值 变量。参数字符串的格式为name = value。如果名字 在环境中尚不存在,然后将字符串添加到 环境。如果name确实存在,那么name中的值 环境变为价值。字符串指向的字符串 成为环境的一部分,所以改变字符串会改变 环境。
答案 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()
方法对其进行转换。