我正在尝试从我的简单 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/