Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中运行UNIX源代码命令_Java_Unix_Terminal - Fatal编程技术网

在Java中运行UNIX源代码命令

在Java中运行UNIX源代码命令,java,unix,terminal,Java,Unix,Terminal,这是我关于stackoverflow的第一个问题,所以我会尽量保持它的简洁性和相关性 我目前正在创建一个Java程序,该程序试图调用位于系统上的外部程序,但是为了做到这一点,我需要调用一个shell脚本,该脚本设置到相关库的链接,以确保在执行外部程序之前,系统链接到这些库 目前的问题是,我无法通过Java调用shell脚本,我已经研究了高级和低级脚本,并且知道其他方法,例如使用ProcessBuilder类。不幸的是,我对试图通过Java调用命令行语句还很陌生,所以我一直在寻找答案 下面是我正在

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

提前谢谢

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

  • 您生成新的进程“sh”,并在那里源代码(我猜是设置了一些变量)
  • 过程结束,所有变量丢失
  • 您生成了另一个进程,但变量已经消失
我不确定以后是否使用这些变量,但根据脚本名称,它可能正在设置一些变量。不要这样做

顺便说一下,如果您只想在bash中执行脚本,则不需要对其进行源代码设置。要获得副作用,只需执行以下操作:

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

请注意,您不能使用~在这种情况下,请使用Java获取home dir。

尝试使用
“-c”
而不是
“-c”
,因为每个空格都很重要。话虽如此,我希望您使用GNU Cygwin。如果不是,并且您没有使用GNUBash,那么我所写的仍然有效。即使是来自其他unix的sh也是这样工作的。这就是我喜欢UNIX的原因。:-)根据您的解释,例如,如果我试图创建一个新进程,通过项目路径将cd保存到项目文件夹中,并尝试运行main.exe,这将失败,因为上一个进程已结束?我必须使用waitfor()方法或类似的方法?