java - 从 Linux 中使用 Java 读取标准输出不起作用

标签 java linux stdout

我正在尝试从我的简单 Linux shellscript 中读取 stdout

test.sh:

#!/bin/bash
echo "I am waiting"
sleep 2s
exit 0 

ShellScriptExecutorTest.java 看起来像:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ShellScriptExecutorTest {

    public static void main(String[] args) {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("sudo", "bash", "./test.sh");
            processBuilder.directory(new File("/home/"));
            processBuilder.inheritIO();
            Process process = processBuilder.start();

            InputStream is = process.getInputStream();  
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);  
            String line;  
            while ((line = br.readLine()) != null) {  
              System.out.println("--> " + line);  
            }  
            
            int exitValue = process.waitFor();
            System.err.println("exitValue: " + exitValue);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果我执行上面的代码,我会得到:

[root@localhost home]# javac ShellScriptExecutorTest.java
[root@localhost home]# java ShellScriptExecutorTest
I am waiting
exitValue: 0

所以,显然 BufferedReader 没有“读取”任何其他内容,否则它会写入:

--> I am waiting

在控制台上。

我怎样才能找出我的错误?

最佳答案

删除这一行

processBuilder.inheritIO();

看看它做了什么:

public ProcessBuilder inheritIO()
Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.

取自此处java api

这正是您在控制台上看到的。 您的子进程的控制台输出被“路由”到您的进程。

不知道你想看什么?但是听起来您希望看到您的子进程的 INPUT?

底线是您需要对子进程和流有更基本的了解。

关于java - 从 Linux 中使用 Java 读取标准输出不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50584473/

相关文章:

python - 与 bsddb 有关的许可证问题

c - 如何在 C 中覆盖标准输出

c - 混合写入 stdout 和调用 WriteConsole 是否总是以相同的顺序打印到控制台?

java - 如何从文本文件加载并执行java命令

java - 帮助处理java中的静态变量

mysqladmin ping错误代码

python - 如何实时将 STDOUT 从导入的模块重定向到 python 中的 Tkinter Text Widget?

java - 求该函数的循环不变量

Java 新手日历类问题

linux - 当您没有权限时在 Mac 或 Linux 上编辑 sudoers 文件