在Java中运行UNIX源代码命令
这是我关于stackoverflow的第一个问题,所以我会尽量保持它的简洁性和相关性 我目前正在创建一个Java程序,该程序试图调用位于系统上的外部程序,但是为了做到这一点,我需要调用一个shell脚本,该脚本设置到相关库的链接,以确保在执行外部程序之前,系统链接到这些库 目前的问题是,我无法通过Java调用shell脚本,我已经研究了高级和低级脚本,并且知道其他方法,例如使用ProcessBuilder类。不幸的是,我对试图通过Java调用命令行语句还很陌生,所以我一直在寻找答案 下面是我正在使用的代码示例:在Java中运行UNIX源代码命令,java,unix,terminal,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没有,这就是问题所在
提前谢谢 问题是,“source”是BASH的内部命令(您使用的是“sh”,但这只是简化模式下的BASH)。所以你要做的是:
- 您生成新的进程“sh”,并在那里源代码(我猜是设置了一些变量)
- 过程结束,所有变量丢失
- 您生成了另一个进程,但变量已经消失
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()方法或类似的方法?