我正在尝试这样做
echo "ls|head -3"|/bin/sh
在Java中。
重要的一点是,我想动态创建脚本字符串并使用该脚本运行shell进程并捕获脚本标准输出。
以上代码无法正常工作并挂起,可能是在输入流上。
Process p = Runtime.getRuntime().exec("/bin/sh");
final OutputStream out = p.getOutputStream();
final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
final String cmd = "ls|head -3";
new Thread(new Runnable() {
@Override
public void run() {
try {
out.write(cmd.getBytes());
out.flush();
} catch (IOException ex) {
}
}
}).start();
final List list = new ArrayList();
new Thread(new Runnable() {
@Override
public void run() {
try {
String line;
while ((line = in.readLine()) != null) {
list.add(line);
}
} catch (IOException ex) {
}
}
}).start();
System.err.println("running ...");
p.waitFor();
System.err.println(list);
}
答案 0 :(得分:0)
在输入流上有数据之前,需要关闭输出流。关闭输出流会向进程确认不会再进行任何输入。只有这样,它才会开始处理并输出到您的输入流。
在调用" flush"后,尝试在第一个帖子中添加以下代码:
out.close();