从子程序流grep,而不是尾文件

Mik*_*ite 0 shell grep

是否存在一个简单的单行代码来从程序中获取连续输出,而不仅仅是一个文件?

现在仅作为示例,我想跳过其中包含的行PHPUnit。出于显而易见的原因,以下要点不会这样做:

phpunit tests/cases | grep -v --line-buffered "PHPUnit"
Run Code Online (Sandbox Code Playgroud)

它可以作为一个通用的oneliner来完成,没有用户定义的函数等等吗?

slm*_*slm 5

这听起来像是 phpunit 命令的输出正在缓冲(通过 PHP、Bash shell 或grep)。有几种方法可以解除对输出的缓冲,使其响应更快。

解除缓冲

您可以尝试使用unbuffer属于expect.

$ unbuffer phpunit tests/cases | grep -v --line-buffered "PHPUnit"
Run Code Online (Sandbox Code Playgroud)

标准缓冲区

您可以尝试使用该stdbuf命令禁用缓冲。

$ stdbuf -i0 -o0 -e0 phpunit tests/cases | grep -v --line-buffered "PHPUnit"
Run Code Online (Sandbox Code Playgroud)

开关详情:

   -i, --input=MODE
          adjust standard input stream buffering

   -o, --output=MODE
          adjust standard output stream buffering

   -e, --error=MODE
          adjust standard error stream buffering
Run Code Online (Sandbox Code Playgroud)

所以上面设置了 STDIN、STDOUT、STDERR 的缓冲设置为零。

格雷普

Grep 本身可能是缓冲输出的罪魁祸首。您可以告诉它在一次输出中仅缓冲一行。(你已经提到/发现了这个,但我提到它是为了让这个问答的未来观众明白那里也有缓冲)。

$ phpunit tests/cases | grep -v --line-buffered "PHPUnit"
Run Code Online (Sandbox Code Playgroud)