输出管道在鱼中等待 EOF

bad*_*adp 1 grep pipe fish

我想获取 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?

bad*_*adp 6

我正在使用fish,这意味着我实际上并没有使用grep,但是:

function grep
    command grep --color=auto $argv
end
Run Code Online (Sandbox Code Playgroud)

和 fish 代码块不会流式传输它们的输出

一开始这不是问题,grep因为它已经被 包裹了env,所以它忽略了这个函数。

更改grep/bin/grep修复它。