使用Java ProcessBuilder执行管道命令

我正在尝试使用Java的ProcessBuilder类来执行一个包含管道的命令。 例如:

 ls -l | grep foo 

但是,我收到一个错误:

 ls: |: no such file or directory 

其次是:

 ls: grep: no such file or directory 

即使该命令在命令行中运行良好,我也无法让ProcessBuilder执行将其输出重定向到另一个的命令。 有没有办法实现这个目标?

这应该工作:

 ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo"); 

要执行管道,您必须调用shell,然后在该shell中运行命令。

最简单的方法是使用命令行作为参数调用shell。 毕竟,它是解释“|”的shell 表示“在两个进程之间管道数据”。

或者,您可以单独启动每个进程,并从“ls -l”的标准输出中读取,将数据写入示例中“grep”的标准输入。