用linux从java读取stdout不起作用

问题描述 投票:0回答:1

我试图从我简单的Linux shell脚本中读取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

在控制台上。

你能搞清楚我的错误吗?

非常感谢您的帮助!

java linux stdout
1个回答
1
投票

删除此行

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?

最重要的是,您需要对子进程和流进行更基本的了解。

© www.soinside.com 2019 - 2024. All rights reserved.