从java执行终端命令

我知道这有很多线索,但它们都不适合我。 这是我想要做的:

Javac并从我的java代码运行一个文件。 它适用于Windows,但我想使它也适用于UNIX。 这里的代码:

if(os.equals("win")){ //For Windows try { Runtime.getRuntime().exec( "cmd /c start cmd.exe /K " + "\"cd " + path + "&& " + "javac " + name + ".java && " + "echo ^>^>" + name + ".java " + "outputs: &&" + "echo. &&" + "java " + name + " && " + "echo. &&" + "pause && " + "exit\""); } catch (IOException e) { System.out.println("Didn't work"); } }else{ try { //TODO make it work for UNIX Runtime.getRuntime().exec(""); } catch (IOException e) { System.out.println("Didn't work"); } } 

问题是,在UNIX系统上它的行为是“不可预测的”例如:

 Runtime.getRuntime().exec("open image.png"); 

打开图像但是

 Runtime.getRuntime().exec("javac Test.java"); Runtime.getRuntime().exec("echo 'hello'"); 

它什么都不做。 没有按摩。

我很感激任何意见。

UPDATE ————————————————- ———–

与Windows CMD相比,终端需要一个InputStreamReader来显示exec中发生的事情。 我在另一个线程中找到了这个代码,现在至少我从exec终端获得了一些输出。

  String line; Process p = Runtime.getRuntime().exec( "echo HelloWorld2" ); BufferedReader in = new BufferedReader( new InputStreamReader(p.getInputStream()) ); while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); 

但事情仍然是神秘的,因为执行

进程p = Runtime.getRuntime()。exec(“javac Test.java”);

工作并生成Test.class文件。 但

进程p = Runtime.getRuntime()。exec(“javac Test.java && java Test”);

什么都不做。(没有任何反应。终端“执行”而没有错误按摩。)在终端版本中手动输入并按预期运行。 我错过了什么?

我这里没有Linux系统可以使用,但我很确定上面的第二个命令是尝试编译名为“Test.java”,“&&”,“java”和“Test”的Java文件; 换句话说,Runtime.exec()方法按字面处理参数而不是应用shell解释。

您可能可以使用以下内容:

 Process p = Runtime.getRuntime().exec( new String[] { "sh", "-c", "javac Test.java && java Test" });