4

这是我关于 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 没有,这就是问题所在。

提前致谢。

4

1 回答 1

3

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

  • 你生成新进程“sh”并在那里获取一些东西(我猜设置了一些变量)
  • 该过程结束并且所有变量都丢失了
  • 你产生了另一个进程,但变量已经消失了

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

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

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

请注意,您不能使用 ~ 在这种情况下,请使用 Java 获取您的主目录。

于 2012-07-03T14:12:49.963 回答