我试图从我简单的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
在控制台上。
你能搞清楚我的错误吗?
非常感谢您的帮助!
删除此行
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?
最重要的是,您需要对子进程和流进行更基本的了解。