我正在尝试从我的简单Linux shellcript中读取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
在控制台上。
你能搞清楚我的错误吗?
非常感谢你的帮助!
答案 0 :(得分: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?
底线是你需要对子进程和流有更基本的了解。