为什么命令组的管道仅适用于某些命令?

时间:2017-09-14 12:44:20

标签: shell pipe pipeline

我有兴趣在grep输出中保留输入的标题,就像问题Include header in the 'grep' result一样。

尽管在问题中提出了一个有效的解决方案(使用sed),answer with most upvotes引起了我的注意。例如,它允许使用grep --color。它建议使用命令headgrep将输入汇总到command group,例如:

ps -ef | { head -1; grep python; }

但是,如链接的答案和注释中所写,这不适用于管道左侧的所有命令。它适用于pslsof,但不适用于dfls和其他人。使用它们时,仅打印组中第一个命令的输出:

$ df | { head -1; grep '/'; }
Filesystem                                   1K-blocks      Used Available Use% Mounted on
$

有人可以解释为什么管道到命令组只适用于某些命令吗?有什么方法可以让它普遍起作用吗?

1 个答案:

答案 0 :(得分:1)

您的问题的答案位于comments of the linked answer

  

显然ps -e首先发送标题行,然后不发送任何内容,然后缓冲输出的其余部分。 head必须认为该流在第一行后关闭,因此它会退出,让grep看到其余的。

它只能偶然发挥作用。

  

有没有办法让它普遍适用?

一切皆有可能,但是,您可能需要重新编码并重新编译其他所有内容。所以...不可能,对不起。