执行Bash脚本在Java中返回Null

时间:2014-09-27 09:53:57

标签: java linux swing bash ubuntu

我使用UBUNTU / LINUX
我试图为自己构建swing应用程序(这个应用程序也需要在其他平台上工作)并且我无法在java上执行某些命令。
我试图执行" java -version"

这是我的代码:

 Runtime run = Runtime.getRuntime();

    Process p = run.exec("java -version");

    try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

        for (String output = br.readLine(); output != null; output = br.readLine()) {
            System.out.println(output);
        }

    } catch (IOException e) {
        System.out.println(e);
    }


返回空白页面无输出!


但是我可以执行run.exec(" ls")/或(" gedit")等...然后我获取数据
我也可以在我的电脑上执行内部程序。
为什么我不能执行.sh文件或内置java命令并获取空白页?

2 个答案:

答案 0 :(得分:6)

您应该使用ProcessBuilder来混合标准和错误输出:

    ProcessBuilder run = new ProcessBuilder("java", "-version");
    run.redirectErrorStream(true);

    Process p = run.start();

    try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

        for (String output = br.readLine(); output != null; output = br.readLine()) {
            System.out.println(output);
        }

    } catch (IOException e) {
        System.out.println(e);
    }

检查java变量中的PATH父目录(输出System.getenv("PATH"))或使用二进制文件的完整路径。

对于脚本,请使用/bin/sh

之类的ProcessBuilder run = new ProcessBuilder("/bin/sh", "/path/to/your/script");

所有路径都可以absolute/开始,或相对(不/)到System.getProperty("user.dir")

答案 1 :(得分:4)

jvm本身将输出定向到错误流

try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {