我试图在c编译的程序中使用unsetenv函数擦除Linux环境变量。我运行c程序,unsetenv成功。但是当我在shell中运行env命令时,TURN_ON_TESTING仍然存在。为什么不擦除?
我的c程序是
#include <stdlib.h>
void main()
{
char *name = "TURN_ON_TESTING";
if(unsetenv(name) == -1)
printf("Error");
}
THX
答案 0 :(得分:1)
哦,但它会消失。不幸的是,不是你想要的。
当您运行二进制bash时,正在创建其“子进程”并将所有变量复制到其中。让我们考虑以下代码:
// ununsetter.cpp
#include <stdlib.h>
#include <iostream>
int main()
{
char *name = "TURN_ON_TESTING";
char *val = "NEW_VALUE";
std::cout << "OLD VALUE: " << getenv(name)<<std::endl;
if(setenv(name, val, 10) == -1)
return -1;
std::cout << "NEW VALUE: " << getenv(name)<<std::endl;
return 0;
}
现在让我们进行测试:
export TURN_ON_TESTING=OLD_VALUE;
./ununsetter
echo $TURN_ON_TESTING;
您将看到TURN_ON_TESTING的状态如下:
OLD_VALUE ---> before running app
OLD_VALUE ---> while running app, but before setting it to NEW_VALUE
NEW_VALUE ---> while running app, after setting it to NEW_VALUE
OLD_VALUE ---> after app is finished
问题是这些值与第一个和最后一个的“对象”不同。