【问题标题】:Running UNIX Source command in Java在 Java 中运行 UNIX Source 命令
【发布时间】:2012-07-03 23:42:33
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 尝试"-c" 而不是"-c ",因为每个空间都很重要。

标签: java unix terminal


【解决方案1】:

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

  • 您生成新进程“sh”并在其中获取某些内容(我猜设置了一些变量)
  • 过程结束,所有变量都丢失了
  • 您生成了另一个进程,但变量已经消失了

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

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

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

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

【讨论】:

  • 话虽如此,我希望您使用 GNU Cygwin。如果不是并且您没有使用 GNU BASH,那么我写的内容仍然有效。甚至来自其他 UNIX 的 sh 也可以这样工作。这就是我喜欢 UNIX 的原因。 :-)
  • 从你的解释来看,例如,如果我试图创建一个新进程,通过项目路径 cd 到项目文件夹并尝试运行 main.exe,这会失败,因为前一个进程已经结束?我必须使用 waitfor() 方法或类似的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多