System.getenv() 在环境变量存在时返回 null

2022-08-31 14:57:33

我正在尝试获取通过终端(Mac)设置的环境变量的值,我还在我的.bash_profile文件中设置了该变量并重新加载。这样做之后,我回显了值,并将正确的值打印到终端。尝试检索变量的值时(我确保在.bash_profile文件中以及使用时使用正确的名称。System.getenv()System.getenv()

在下面的代码中,我将变量的名称替换为VAR_NAME

String varValue = System.getenv("VAR_NAME");
System.out.println("Value: " + varValue);

在我的.bash_profile:

export VAR_NAME="foo"

当我打印出 的值时,打印出“null”。varValue

这可能是什么原因造成的?

编辑:我在这里按照顶部答案,重新启动Eclipse,它起作用了!


答案 1

这个问题的答案比Java更一般。System.getenv()

每个进程都有自己独立的环境变量副本,而环境变量仅沿进程树向下移动,并且仅在创建子进程时才从父进程复制到子进程。在你的例子中,你的shell,它本身就是一个进程,启动/创建了Eclipse进程。因此,Eclipse 是 shell 的子进程,因此,Eclipse 实例上定义的环境变量是启动 Eclipse 时在 shell 上定义的环境变量的副本。

您可能在启动 Eclipse 在 shell 上定义了环境变量。因此,Eclipse 和它创建的子 Java 进程永远不会“知道”你的新环境变量。

由于这种行为,实际上这里的解决方案是退出Eclipse并从shell中再次启动它,其中已经定义了环境变量。另一种选择是转到项目的运行配置,并在其中定义环境变量。

附言

  1. 显然,如果重新启动计算机,则不会保存您在 shell 上定义的环境变量,因为您定义变量的 shell 进程将消失。

  2. 如果您使用 bash,则通过将环境变量设置命令添加到文件 ,每次启动 bash 进程时都会执行该命令,您可以模拟永久环境变量的行为。~/.bashrc

  3. 还有其他方法可以定义永久环境变量。您可以在此处查看以获取更多信息。


答案 2

推荐