我想获取 csearch 输出并为其着色。它看起来像这样:
/home/bp/whatever.txt:1:foo
Run Code Online (Sandbox Code Playgroud)
这有效:
csearch -n -- $term \
| env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
| grep -P --color=always -- $term \
| less -RFX
Run Code Online (Sandbox Code Playgroud)
但是,它会csearch
在显示任何内容之前等待计算完整的输出。
现在,如果我这样做:
csearch -n -- $term \
| env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
| pv
| grep -P --color=always -- $term \
| less -RFX
Run Code Online (Sandbox Code Playgroud)
...我可以看到数据流动,但如果我这样做:
csearch -n -- $term \
| env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
| grep -P --color=always -- $term \
| pv
| less -RFX
Run Code Online (Sandbox Code Playgroud)
...没有数据流动。第二个grep
似乎在等待 EOF。
添加--line-buffered
到两个 grep 似乎对我没有好处。
为什么这个命令管道在等待 EOF?
我正在使用fish
,这意味着我实际上并没有使用grep
,但是:
function grep
command grep --color=auto $argv
end
Run Code Online (Sandbox Code Playgroud)
一开始这不是问题,grep
因为它已经被 包裹了env
,所以它忽略了这个函数。
更改grep
以/bin/grep
修复它。