尽管`grep -L x <<<x` 返回1,为什么`grep -L x <<<x >/dev/null` 返回0?

Kir*_*gin 2 linux grep gnu

我有 GNU grep 3.3-1(Debian Buster 中的当前版本)。

来自man grep

退出状态

通常,如果选择了一行,退出状态为 0,如果没有选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。但是,如果使用-qor--quiet--silent选择了一行,即使发生错误,退出状态也是 0。

这与POSIX一致。(-L此处未指定。)

最新版本的完整文档最新提交中的文档没有关于-L( --files-without-match) 的更多详细信息。

grep -L x <<<x(in bash) 以代码 1 退出。我不确定这是否与文档一致(这里选择的行到底是什么?),但至少这是可以解释的:没有输入文件符合必须没有x.

grep -Lq x <<<x并且grep -L x <<<x >/dev/null都以代码 0 退出。好吧,-q稍微好理解一点,但是为什么 stdout 重定向会影响退出代码?因此,要在抑制输出的同时获得原始退出代码行为,(set -o pipefail; /bin/grep -L x <<<x | cat >/dev/null)需要进行类似的 hack 。这是为什么?

由于 GNU grep 被如此广泛地使用,我不确定这是一个错误grep:我更有可能错过一些东西。或者也许退出代码-L只是不依赖的东西?即使您可以使用像这样的测试运行和源代码来了解当前版本的行为,但这种行为将来可能会发生变化,因为它与当前文档不一致。你怎么认为?

(顺便说一句,除了非 2 退出代码(in )和像(in )这样的边缘情况外,最新提交中的测试似乎没有进行测试。)-Lin-eq-out-infloop-f /dev/nullskip-read

Ste*_*itt 5

这是一个错误,已在 GNU grep3.4修复

当标准输出为 /dev/null 时,'grep -L' 的退出状态不再不正确。

[Bug#37716 在 grep 3.2 中引入]

这是相关的提交