我正在编写Java控制台应用程序,它从环境变量(Linux)中获取输入参数。要设置这些变量,我的应用程序必须“获取”shell脚本。我可以使用Runtime.exec()或ProcessBuilder来“源”脚本,但我不知道如何访问创建的环境变量。
我的shell脚本(set_env.sh):
#!/bin/csh
setenv MY_DB DB_NAME
上面的脚本有“源代码”的Java代码:
ProcessBuilder pb = new ProcessBuilder("csh", "-c", "'source set_env.sh'");
Process p = null;
try {
p = pb.start();
p.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
如何获取对已创建的MY_DB变量的访问权限,或者我的问题还有其他解决方案吗?
任何帮助将非常感谢。 先感谢您。
好的伙计们。谢谢你的回答。有我的临时解决方案。我写了另一个脚本,使“源”和回声创建变量。在执行它的Java代码中,读取进程的输入流并解析它们。
答案 0 :(得分:2)
您可以使用System#getenv()
和System#getenv(String name)
访问环境变量。
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
}
}
然而,如Sylvain Leroux和Serge Ballesta所述,使用Process#start()
创建的子进程无法修改其父项的环境。
如果您的目的只是设置java代码使用的一些变量,那么java Properties
可能更适合。
答案 1 :(得分:1)
如何获取对已创建的MY_DB变量的访问权限,或者我的问题还有其他解决方案吗?
你不能。当你&#34; source&#34;您的文件,实际上是由您启动的子shell读取的。修改了此子shell的环境。但是环境修改不传播回父进程。
据我所知,System.env在JVM启动期间初始化,在应用程序生命周期内无法修改。 是和否.Java标准库不提供必要的调用来更改当前环境。但不要以为环境是以某种方式锁定的#34;。这实际上比这更简单:每个进程(shell,JVM实例,其他任何进程)在创建时都会收到其父环境的副本。您可以使用副本执行所需操作,但由于 是副本,因此它与父级环境无关。当您启动新流程时,它会在创建环境时收到环境的副本。
截至&#34;失踪&#34;在Java中的setEnv
方法,这可能是(?)因为Sun的某个人认为会打破咒语&#34;写一次,到处运行&#34;因为有些系统没有环境变量?见How do I set environment variables from Java?
BTW,如果您需要自定义环境来启动外部流程,您实际上可以使用Runtime.html#exec
的第二个参数构建自己的环境