Java 设置环境变量并在运行时获取值

Java 设置环境变量并在运行时获取值,java,unix,environment,Java,Unix,Environment,我需要在运行时设置一个环境变量,并使用JAVA在UNIX环境中获取该变量的值。 下面是我的代码。但是,它无法获取环境变量,并且进程输出没有显示在控制台中。没有抛出异常 public static void main (String[] args) { String USR_HOME = System.getProperty("user.home"); String profileName = USR_HOME+"/.profile"; String installP

我需要在运行时设置一个环境变量,并使用JAVA在UNIX环境中获取该变量的值。 下面是我的代码。但是,它无法获取环境变量,并且进程输出没有显示在控制台中。没有抛出异常

public static void main (String[] args) {
     String USR_HOME = System.getProperty("user.home");
     String profileName = USR_HOME+"/.profile";
     String installPath = System.getProperty("user.dir");
     String str = "";
      try {
      PrintWriter dynServ = new PrintWriter(new BufferedWriter(new FileWriter(profileName,true)));
      str = "FIC_HOME=" + installPath;
      dynServ.println(str);
      str = "export FIC_HOME";
      dynServ.println(str);
      dynServ.flush();
      dynServ.close();

        }catch (Exception e){

        System.out.println(e.getMessage());
      }

  ProcessBuilder pb = new ProcessBuilder("sh","-c",". ./.profile");
  Map<String, String> env = pb.environment();
  env.put("FIC_HOME", USR_HOME+"/Path");
  pb.directory(new File(USR_HOME));
    try {
        Process p = pb.start();
        BufferedReader Inreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line="";
           while ((line=Inreader.readLine())!=null)
             {
                System.out.println(line);
                //System.err.println(line);
              }
    } catch (Exception ex) {
        System.out.println("Exeception ::: "+ex.getMessage());
    }

System.out.println("FIC_HOME value :::"+System.getenv("FIC_HOME"));
publicstaticvoidmain(字符串[]args){
字符串USR_HOME=System.getProperty(“user.HOME”);
字符串profileName=USR_HOME+“/.profile”;
字符串installPath=System.getProperty(“user.dir”);
字符串str=“”;
试一试{
PrintWriter dynServ=新的PrintWriter(新的BufferedWriter(新的FileWriter(profileName,true));
str=“FIC_HOME=“+installPath;
dynServ.println(str);
str=“导出FIC_主页”;
dynServ.println(str);
dynServ.flush();
dynServ.close();
}捕获(例外e){
System.out.println(e.getMessage());
}
ProcessBuilder pb=新的ProcessBuilder(“sh”、“-c”、“./.profile”);
Map env=pb.environment();
环境put(“FIC_HOME”,USR_HOME+”/Path);
目录(新文件(USR_HOME));
试一试{
进程p=pb.start();
BufferedReader Inreader=新的BufferedReader(新的InputStreamReader(p.getInputStream());
字符串行=”;
而((line=Inreader.readLine())!=null)
{
系统输出打印项次(行);
//系统错误打印项次(行);
}
}捕获(例外情况除外){
System.out.println(“Exeception::”+ex.getMessage());
}
System.out.println(“FIC_HOME value:::”+System.getenv(“FIC_HOME”);
输出为: .已执行的配置文件 FIC_主值:::空


有人能提出一些建议吗?

当前java进程的环境不会被从中运行的子进程修改。
您的
Runtime.exec
创建一个子进程,该子进程有自己的环境(根据当前java进程的环境初始化)。该子进程运行很短时间,然后终止。但是,这并没有改变当前java(即父进程)的环境进程——这就是为什么父进程上的
System.getenv
对于env变量仍然没有任何值。

当前java进程的环境不会被从它运行的子进程修改。
您的
Runtime.exec
创建一个子进程,该子进程有自己的环境(根据当前java进程的环境初始化)。该子进程运行很短时间,然后终止。但是,这并没有改变当前java(即父进程)的环境进程——这就是为什么父进程上的
System.getenv
对env变量仍然没有任何价值。

我不知道
java
,但据我所知,您是在
java
程序的子shell中执行所有命令(
String[]command={“sh”、“-c”、“cd”、“./.profile”};
)。这意味着环境变量被设置在这个
sh
shell中并导出到它的子shell中。但是父(java程序)没有看到这个变量。

我不知道
java
,但据我所知,您正在从
java
程序的子shell中执行所有命令(
String[]command={“sh”、“-c”、“cd”、“./.profile”};
)。这意味着环境变量在这个
sh
shell中设置并导出到它的子脚本。但是父脚本(java程序)未看到此变量。

请检查Runtime.exec的重载API。有些API允许您将环境变量作为数组传递,例如

这就是如何将变量设置到子进程的环境中的方法。但正如其他人所指出的,这无助于访问父进程的子进程中设置的环境变量

您的实际需求还不清楚,但下面是一个将环境变量传递给子进程并在父Java进程中读取变量(而不是设置变量)的示例

以下是示例代码:

import java.io.*;

public class EnvTest {
  public static void main(String[] args) throws Exception {
    String[] cmd = {"sh","-c","env | grep FIC_HOME"};
    String[] envp = {"FIC_HOME=foo"};
    Process p = Runtime.getRuntime().exec(cmd, envp);
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = reader.readLine()) != null) {
       System.err.println(line);
    }
  }
}
和样本输出:

$ java EnvTest
FIC_HOME=foo

检查Runtime.exec的重载API。有一些API允许您将环境变量作为数组传递,例如

这就是如何将变量设置到子进程的环境中的方法。但正如其他人所指出的,这无助于访问父进程的子进程中设置的环境变量

您的实际需求还不清楚,但下面是一个将环境变量传递给子进程并在父Java进程中读取变量(而不是设置变量)的示例

以下是示例代码:

import java.io.*;

public class EnvTest {
  public static void main(String[] args) throws Exception {
    String[] cmd = {"sh","-c","env | grep FIC_HOME"};
    String[] envp = {"FIC_HOME=foo"};
    Process p = Runtime.getRuntime().exec(cmd, envp);
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = reader.readLine()) != null) {
       System.err.println(line);
    }
  }
}
和样本输出:

$ java EnvTest
FIC_HOME=foo

嗯,不清楚为什么您的程序需要在.profile文件中定义一个环境变量。如果您澄清了您实际想要完成的任务,也许我们可以提供更多帮助。您当前的方法听起来不是一个好主意,因为如果.profile文件已经包含v,您需要非常小心,不要错误地重写它有价值的信息

现在,有一种简单的方法可以使用流程对象的错误输出流检查是否有任何错误

您还可以读取.profile文件,查看其内容是否与您打算在其上写入的内容相匹配

您的第二段代码似乎只是运行您刚刚编写环境变量的.profile文件。我只能假设您的.profile文件只显示:

FIC_HOME=/home/edalorzo/
export FIC_HOME
因此,当您在第二个进程中运行代码时,我不明白为什么要生成任何特定的输出

写入文件后,还可以检查命令是否正确读取.profile文件

sh命令如下所示

-c选项使命令 可以从字符串操作数中读取 而不是从标准输入。 请记住,此选项仅适用于 接受单个字符串作为其 arg