这是我关于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没有,这就是问题所在。
提前致谢。
答案 0 :(得分:3)
问题是“source”是BASH的内部命令(你使用的是“sh”,但在简化模式下它只是BASH)。所以你要做的是:
我不确定你以后是否使用这些变量,但根据脚本名称,它可能会设置一些。不要这样做。
顺便说一句,如果您只想在bash中执行脚本,则无需获取它。要获得它的副作用,只需执行:
String sourcePath [] = {"/bin/sh ", "/home/XYZ/set_env_WRF_gnu.sh"} ;
请注意你不能使用〜在这种情况下,使用Java来获得你的家庭目录。