【问题标题】:Using Java ProcessBuilder to Execute a Piped Command使用 Java ProcessBuilder 执行管道命令
【发布时间】:2011-04-16 03:03:22
【问题描述】:

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

ls -l | grep foo

但是,我收到一个错误:

ls: |: no such file or directory

接着是:

ls: grep: no such file or directory

即使该命令在命令行中完美运行,我也无法让 ProcessBuilder 执行将其输出重定向到另一个的命令。

有没有办法做到这一点?

【问题讨论】:

    标签: java command-line


    【解决方案1】:

    这应该可行:

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

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

    【讨论】:

    • 出于某种原因,我还需要为 ls /dev/sd* IOW 执行此操作,ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "ls /dev/sd*"); 效果很好,而 ProcessBuilder pb = new ProcessBuilder("ls", "/dev/sd*"); 没有没有工作。猜测它与字符串中* 的可变参数解释有关......对我来说似乎是一个错误。也可能是因为“特殊”/dev 设备,不确定。
    • 扩展通配符的是shell,不是ls。如果你输入了ls '/dev/sd*',那也行不通。
    【解决方案2】:

    最简单的方法是以命令行为参数调用shell。毕竟,解释“|”的是shell意思是“在两个进程之间传输数据”。

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

    【讨论】:

    • 似乎是一个不错的选择,比运行多个 shell 以获得正确的输出要好。谢谢!
    最近更新 更多