在Java中运行UNIX Source命令

时间:2012-07-03 14:04:51

标签: java unix terminal

这是我关于stackoverflow的第一个问题,所以我会尽量保持简洁和相关。

我正在创建一个试图调用位于系统上的外部程序的Java程序,但是为了做到这一点,我需要调用一个shell脚本来设置相关库的链接以确保在可以执行外部程序之前,系统会链接到这些系统。

手头的问题是我无法通过Java调用shell脚本,我已经研究过高低,并且意识到使用ProcessBuilder类等替代方法。不幸的是,我对尝试通过Java调用命令行语句的世界很新,所以我很难找到答案。

我正在使用的代码示例如下:

private void analyse_JButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                

// Get project path for copying of Fortran program to folder and execution

String projectPath =  Newproject_GUI.getProjectPath();


String sourcePath [] = {"/bin/sh ", "-c ","source ~/set_env_WRF_gnu.sh"} ;



Runtime fortranAnalyser = Runtime.getRuntime();

try {
        Process p = fortranAnalyser.exec("cp main.exe " + projectPath);
        Process k = fortranAnalyser.exec(sourcePath);



        BufferedReader is = new BufferedReader(new InputStreamReader(k.getInputStream()));
        String line;
        while ((line = is.readLine()) != null) {

            System.out.println(line); 
        } 


    } catch (IOException ex) {
        Logger.getLogger(Analyser_GUI.class.getName()).log(Level.SEVERE, null, ex);
      }

}

进程p工作正常,并且在调用方法时确实将main.exe复制到目标目录。然而,过程k没有,这就是问题所在。

提前致谢。

1 个答案:

答案 0 :(得分:3)

问题是“source”是BASH的内部命令(你使用的是“sh”,但在简化模式下它只是BASH)。所以你要做的是:

  • 你产生了新的进程“sh”并在那里找到了一些东西(我猜想设置一些VARIABLES)
  • 流程结束,所有VARIABLES都丢失
  • 你产生了另一个进程,但VARIABLES已经消失了

我不确定你以后是否使用这些变量,但根据脚本名称,它可能会设置一些。不要这样做。

顺便说一句,如果您只想在bash中执行脚本,则无需获取它。要获得它的副作用,只需执行:

String sourcePath [] = {"/bin/sh ", "/home/XYZ/set_env_WRF_gnu.sh"} ;

请注意你不能使用〜在这种情况下,使用Java来获得你的家庭目录。