这是我关于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”并在那里找到一些东西(我想设置一些VARIABLES)
>流程结束,所有VARIABLES都丢失了
>你产生了另一个进程,但VARIABLES已经消失了
我不确定你以后是否使用这些变量,但根据脚本名称,它可能会设置一些.不要这样做.
顺便说一句,如果您只想在bash中执行脚本,则无需获取它.要获得它的副作用,只需执行以下操作:
String sourcePath [] = {"/bin/sh ", "/home/XYZ/set_env_WRF_gnu.sh"} ;
请注意你不能使用〜在这种情况下,使用Java来获得你的家庭目录.
标签:java,unix,terminal
来源: https://codeday.me/bug/20190630/1332863.html