为什么eclipse或cmd控制台缓存OS env变量?

时间:2013-05-07 14:27:09

标签: java caching environment-variables

我想获得一个OS(Windows XP)env变量,我的代码在下面(jdk 1.6):

public class TestEnv{

public static void main(String...args){
    System.out.println(System.getenv("catalina_home"));
 }
}

在frist,我的PC中没有名为catalina_home的变量,它输出null,然后我在catalina_home中添加My Computer > Advanced > Environment Variables变量,它仍然输出{{ 1}},如果我关闭并重新启动eclipse,它会输出正确的值。如果我在这样的cmd控制台中运行此代码,我会关闭并重新启动一个新的cmd控制台以获取正确的值,如果我删除一个现有变量,首先它输出一个非空值,直到我重新启动eclipse或cmd控制台,它可以输出null。所以我认为eclipse或cmd控制台已经缓存了OS env变量,但是没有证据,即使它们确实存在,我想知道为什么? 任何想法将不胜感激。非常感谢。

3 个答案:

答案 0 :(得分:3)

当一个进程启动时,它将从它的父进程获得当前环境的副本。您必须重新启动进程才能获得一组新环境。它就是这样儿的。 :)这不是eclipse的问题,它是操作系统的行为方式。

答案 1 :(得分:2)

在Unix(Linux + Mac)和Windows上,进程在启动时都会复制env变量。

这意味着变量映射始终是进程本地的,并且不会看到其他进程所做的更改。

有两个原因:

  1. 安全。攻击者可以通过在进程启动后修改env变量来修改正在运行的进程的行为,并导致意外/不需要的行为;想象一下,攻击者可以更改现有进程的PATH变量。这样,他们就可以将受到破坏的代码注入可信进程。

  2. 线程安全。如果任何人都可以随时更改局部变量,则需要一种方法来同步访问和修改。

答案 2 :(得分:0)

如果在命令解释程序中使用SET命令设置环境变量,它将在那里应用,然后应用于该进程的环境。没有重启,没有注销和开启 - 没有必要。