我正在尝试从java程序运行一个shell脚本(比如myscript.sh)。
当我从终端运行脚本时,像这样:
./myscript.sh
它工作正常。
但是当我从java程序中调用它时,使用以下代码:
try
{
ProcessBuilder pb = new ProcessBuilder("/bin/bash","./myScript.sh",someParam);
pb.environment().put("PATH", "OtherPath");
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line ;
while((line = br.readLine()) != null)
System.out.println(line);
int exitVal = p.waitFor();
}catch(Exception e)
{ e.printStackTrace(); }
}
它没有同样的方式。 跳过几个shell命令(如sed,awk和类似的命令)并且根本不提供任何输出。
问题:有没有办法在使用java的新终端中启动此脚本。
PS:我发现“gnome-terminal”命令在shell中启动了一个新的终端, 但是,我无法弄清楚如何在java代码中使用相同的东西。
我很擅长使用shell脚本。请帮忙
提前致谢
答案 0 :(得分:1)
在java中:
import java.lang.Runtime;
class CLI {
public static void main(String args[]) {
String command[] = {"/bin/sh", "-c",
"gnome-terminal --execute ./myscript.sh"};
Runtime rt = Runtime.getRuntime();
try {
rt.exec(command);
} catch(Exception ex) {
// handle ex
}
}
}
脚本的内容是:
#!/bin/bash
echo 'hello!'
bash
注意:
bash
;否则执行完成,终端关闭。答案 1 :(得分:0)
不要覆盖整个路径......
pb.environment().put("PATH", "OtherPath"); // This drops the existing PATH... ouch.
试试这个
pb.environment().put("PATH", "OtherPath:" + pb.environment().get("PATH"));
或者,在脚本文件中使用命令的完整目录。
答案 2 :(得分:0)
您必须先将shell脚本文件设置为可执行文件,然后添加以下代码,
shellScriptFile.setExecutable(true);
//Running sh file
Process exec = Runtime.getRuntime().exec(PATH_OF_PARENT_FOLDER_OF_SHELL_SCRIPT_FILE+File.separator+shellScriptFile.getName());
byte []buf = new byte[300];
InputStream errorStream = exec.getErrorStream();
errorStream.read(buf);
logger.debug(new String(buf));
int waitFor = exec.waitFor();
if(waitFor==0) {
System.out.println("Shell script executed properly");
}
答案 3 :(得分:0)
这对我在Ubuntu和Java 8上起作用
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="portfolioCtrl">
<div ng-repeat="project in projects">
<h3>{{project.title}}</h3>
<p>{{project.language}}</p>
<p>{{project.description}}</p>
<p id="github"><a href="{{project.link}}">Check it out on Github!</a></p>
</div>
</div>
以前的代码在特定的目录中创建 新的终端,执行一个命令
答案 4 :(得分:0)
script.sh必须具有可执行权限
public class ShellFileInNewTerminalFromJava {
public static void main(String[] arg) {
try{
Process pr =new ProcessBuilder("gnome-terminal", "-e", "pathToScript/script.sh").start();
}catch(Exception e){
e.printStackTrace();
}
}
}