【问题标题】:How can I run a shell script, written in Bash on Ubuntu, from Java in a Windows 10 environment?如何在 Windows 10 环境中从 Java 运行在 Ubuntu 上用 Bash 编写的 shell 脚本?
【发布时间】:2018-05-23 19:28:33
【问题描述】:

如何在 Windows 10 环境中从 Java 运行在 Ubuntu 上用 Bash 编写的 shell 脚本?
我正在尝试使用此代码,但它没有运行也没有执行脚本。

    public static void main(String[] args) throws IOException {
        Runtime rt = Runtime.getRuntime();
        ProcessBuilder builder = new ProcessBuilder(
            "bash.exe", "/mnt/d/Kaldi-Java/kaldi-trunk/tester.sh");

        Process p = builder.start();
        BufferedReader r = new BufferedReader(new 
        InputStreamReader(p.getInputStream()));
        String line;
        while (true) {
            line = r.readLine();
            if (line != null) {  System.out.print(line);}
            else{break;}   
        }
    }

【问题讨论】:

  • bash.exe 可能必须是完全限定的并且您已经定义了一个冗余的运行时...

标签: java windows bash ubuntu


【解决方案1】:

首先:您是否尝试从命令行执行此命令?如果你这样做了并且它有效,则意味着问题不在于 Windows 上的 bash,而在于你的 java 程序。

如果无法从命令行执行,请先解决此问题

我无法测试我的程序,因为我使用的是 Ubuntu,但可以建议你尝试这样的事情:(等到程序结束)

public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {
        ProcessBuilder builder = new ProcessBuilder(
                "bash.exe", "/mnt/d/Kaldi-Java/kaldi-trunk/tester.sh");

        Process p = builder.start();

        /* waitFor() method stops current thread until this process is over */
        p.waitFor();
        // I think that scanner is a nicer way of parsing output
        Scanner scanner = new Scanner(p.getInputStream());
        while (scanner.hasNextLine()) {
            // you do not have to create `line` outside the loop
            // it does not change performance of a program
            String line = scanner.nextLine();
            System.out.println(line);
        }
    }
}

【讨论】:

    【解决方案2】:

    如果您尝试在 Windows 环境中使用 Java 运行脚本,我建议您以不同的方式执行它。

    我已根据此处提出的宝贵问题改编了您的代码:

    How to run Unix shell script from Java code?

    此外,这个问题将帮助您解决您的问题: Unable to read InputStream from Java Process (Runtime.getRuntime().exec() or ProcessBuilder)

    public static void main(String[] args) throws IOException {
    
        Process proc = Runtime.getRuntime().exec(
                "/mnt/d/Kaldi-Java/kaldi-trunk/tester.sh"); 
        BufferedReader read = new BufferedReader(
                new InputStreamReader(proc.getInputStream()));
    
        while (read.ready()) 
        {
            System.out.println(read.readLine());
        }
    
    }
    

    我相信这就是您正在寻找的。我相信您的 Java 代码有点偏离,这些编辑应该对您有所帮助。构建 java 可执行文件后,您可以通过 Window 的命令提示符运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 2015-08-24
      • 2012-04-08
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多