java - 从java执行终端命令

标签 java terminal command

我知道有很多关于此的话题,但没有一个对我有用。这是我正在尝试做的事情:

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();

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

Process p = Runtime.getRuntime().exec("javac Test.java");

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

Process 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" });

关于java - 从java执行终端命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26468715/

相关文章:

linux - 从文件中删除未出现在另一个文件中的行,错误

java - 如何初始化相互依赖的最终引用?

java - 找到最长的公共(public)前缀?

python - 将彩色、右对齐的文本输出到终端

linux - ImageMagick - 带引号的数字作为转换标签参数会导致命令失败

php - Symfony 进程 - 从服务执行命令

java - Elasticsearch:在传输层捕获异常

java - quartz 触发器不触发

linux - 跨多个操作系统在 VIM 中编译

powershell - 保留管道输出的颜色