如何从java程序在新的gnome终端中启动shell脚本
我试图从java程序运行一个shell脚本(比如myscript.sh) 当我从终端运行脚本时,如下所示:如何从java程序在新的gnome终端中启动shell脚本,java,bash,shell,Java,Bash,Shell,我试图从java程序运行一个shell脚本(比如myscript.sh) 当我从终端运行脚本时,如下所示: ./myscript.sh 它很好用 但当我从java程序调用它时,使用以下代码: try { ProcessBuilder pb = new ProcessBuilder("/bin/bash","./myScript.sh",someParam); pb.environment().put("PATH", "OtherPath");
./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脚本非常陌生。请帮忙
提前感谢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
注:
- 您将在后台线程或工作线程中执行此操作
- shell脚本中的最后一个命令是
;否则执行完成,终端关闭bash
- shell脚本位于与调用Java类相同的路径中
pb.environment().put("PATH", "OtherPath"); // This drops the existing PATH... ouch.
试试这个
pb.environment().put("PATH", "OtherPath:" + pb.environment().get("PATH"));
或者,使用脚本文件中命令的完整目录。必须先将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");
}
这在Ubuntu和Java8上对我很有效
Process pr =new ProcessBuilder("gnome-terminal", "-e",
"./progrm").directory(new File("/directory/for/the/program/to/be/executed/from")).start();
以前的代码在指定的目录中创建新的终端,并执行命令脚本。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();
}
}
}
您确定这些命令位于您设置的“其他路径”中吗?