【问题标题】:Java getenv() returns nullJava getenv() 返回 null
【发布时间】:2015-12-09 11:39:57
【问题描述】:

我正在使用TestEnviron=varproperty 在 Linux shell 中定义一个环境变量。现在,我想编写一个小程序来读取环境变量,将其写入控制台输出,并将变量写入属性文件。但是,当我尝试使用此代码时,getenv() 返回null

package javaenvironmentvariable;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;

public class JavaEnvironmentVariable {
    public static void main(String[] args) {
        try {
            String variable = System.getenv("TestEnviron");
            System.out.println("TestEnviron: " + variable);
            variable = "TestEnviron=" + variable;

            Properties properties = new Properties();

            File file = new File("Variables.properties");
            FileOutputStream fileout = new FileOutputStream(file);
            properties.store(fileout, variable);
            fileout.close();
        } catch (Exception e) {
        }
    }
}

我在shell中使用这个来调用jar:sudo java -jar JavaEnvironmentVariable.jar

【问题讨论】:

  • 你是如何在 shell 中定义你的变量的?您是在定义程序后立即运行程序还是在另一个 shell 中运行程序?你如何启动你的程序?
  • 如果你使用另一个shell来启动你的程序,使用export来定义你的变量:export TestEnviron=varproperty
  • @perencia 我在 stell 中使用了 TestEnviron=varproperty,然后我在同一个 shell 中使用这个 sudo java -jar JavaEnvironmentVariable.jar 运行我的程序。
  • @nickbijmoer 如果您在 shell 中执行 env,您会得到变量吗?
  • 为什么使用sudo?有关sudo 和环境变量的更多信息,请参阅this question。您可以使用 sudo -E 启动您的程序,以将您的环境保持在 sudo 中。

标签: java linux shell null getenv


【解决方案1】:

您应该使用sudo -E AND export 来保留环境变量:

$ export TestEnviron=varproperty
$ sudo -E java -jar JavaEnvironmentVariable.jar

但是为了更安全,您应该配置 sudo 以保留您的变量,如本文所述:How to keep Environment Variables when Using SUDO

sudo visudo

并添加这一行:

Defaults env_keep += "TestEnviron"

【讨论】:

  • 是的,这就是解决方案!多谢!我不知道 sudo 不会保留环境变量。
【解决方案2】:

Shell 不会自动将其变量放入环境中。您需要使用 export ENVVAR=VALUEset -x ENVVAR VALUE 显式导出变量,具体取决于您的 shell。

【讨论】:

  • 它没有用,因为我显然使用了 sudo 但感谢导出提示 :)
【解决方案3】:

我认为您在一个 shell 中设置环境变量并在另一个 shell 中执行您的程序。尝试在同一个 shell 中执行两者。在执行程序检查之前,在 shell 中打印环境变量。

【讨论】:

  • 我在同一个 shell 中执行它们但仍然为空,我用以下代码打印了变量:echo $TestEnviron 然后它返回 varproperty,这样就可以了。
猜你喜欢
  • 2017-01-08
  • 2019-03-30
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2020-12-27
相关资源
最近更新 更多