是否存在一个简单的单行代码来从程序中获取连续输出,而不仅仅是一个文件?
现在仅作为示例,我想跳过其中包含的行PHPUnit。出于显而易见的原因,以下要点不会这样做:
phpunit tests/cases | grep -v --line-buffered "PHPUnit"
Run Code Online (Sandbox Code Playgroud)
它可以作为一个通用的oneliner来完成,没有用户定义的函数等等吗?
这听起来像是 phpunit 命令的输出正在缓冲(通过 PHP、Bash shell 或grep)。有几种方法可以解除对输出的缓冲,使其响应更快。
$ 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)