【问题标题】:Executing terminal commands from java从java执行终端命令
【发布时间】:2014-12-15 14:47:34
【问题描述】:

我知道有很多关于此的主题,但没有一个对我有用。这是我想要做的:

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'");

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

感谢您的任何意见。

更新------------------------------- -----------------

与 Windows CMD 相比,Terminal 需要一个 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");

什么都不做。(什么都没有发生。终端“执行”而没有错误消息。)在终端中手动键入它会按预期构建和运行。我错过了什么?

【问题讨论】:

  • 在什么情况下不起作用?你得到什么输出?你在期待什么?
  • “不起作用”是什么意思?你能和我们分享一下异常堆栈跟踪吗?
  • 不起作用 = 它只是不执行命令。从示例 Runtime.getRuntime().exec("javac Test.java");它不会生成 Test.class。
  • Runtime.exec() 返回一个 Process 对象,该对象具有可用的 stdout 和 stderr 流 - 阅读这些应该会给你任何操作系统生成的错误消息。
  • 好的。有趣的。因为在 windows 上,所有的错误信息都直接显示在 cmd 窗口中。

标签: java terminal command


【解决方案1】:

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

您可能可以让它与以下内容一起工作:

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

【讨论】:

  • 几乎!东西工作!我现在可以将我的命令串在一起。但还有一件事。 Test.java 有一个 System.out.println("worked!");但这不会显示在任何地方..(在 Windows 中,每个 I/O,即使它来自刚刚编译和执行的文件,也会显示在同一个 cmd 窗口中。)这里来自编译文件的 I/O(Test.class ) 不显示。
  • 该输出应该进入您从 exec() 调用返回的 Process 对象中获得的标准输出流。
最近更新 更多