输出管道等待 Fish 中的 EOF

输出管道等待 Fish 中的 EOF

我想获取 csearch 输出并为其着色。看起来像这样:

/home/bp/whatever.txt:1:foo

这有效:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | grep -P --color=always -- $term \
  | less -RFX

csearch然而,在显示任何内容之前,它会等待计算出完整的输出。

现在,如果我这样做:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | pv
  | grep -P --color=always -- $term \
  | less -RFX

...我可以看到数据流动,但如果我这样做:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | grep -P --color=always -- $term \
  | pv
  | less -RFX

...没有数据流动。第二个grep似乎正在等待 EOF。

添加--line-buffered到两个 grep 似乎对我没有好处。

为什么这个命令管道等待 EOF?

答案1

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

function grep
    command grep --color=auto $argv
end

Fish 代码块不会传输其输出

这在第一个中不是问题,grep因为它已经被 包装了env,所以它忽略了这个函数。

更改grep/bin/grep修复它。

相关内容