终端 - 即使未找到匹配项,为什么 grep 的退出命令为 0?

ton*_*nix 6 shell terminal grep exit-code

我有这个命令:

grep -E '^nothing' List.txt | echo $?
Run Code Online (Sandbox Code Playgroud)

这里 grep 不匹配任何东西,我只是输出它的退出代码。根据 grep 的文档:

通常,如果选择了一行,退出状态为 0,如果没有选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。但是,如果使用 -q 或 --quiet 或 --silent 选项并选择了一行,即使发生错误,退出状态也是 0。其他 grep 实现可能会在出错时以大于 2 的状态退出。

但:

prompt:user$ grep -E '^nothing' List.txt | echo $?
0
prompt:user$
Run Code Online (Sandbox Code Playgroud)

但是为什么即使匹配不存在,我也会得到 0 作为输出,我不应该得到预期的 1 退出代码吗?

anu*_*ava 4

这就是问题:

grep -E '^nothing' List.txt | echo $?
Run Code Online (Sandbox Code Playgroud)

通过使用 single,|您发送的输出将始终打印grepecho一个命令的退出状态,并且无论是否找到模式,该输出都将始终为 0。

您可以使用grep -q

grep -qE '^nothing' List.txt
Run Code Online (Sandbox Code Playgroud)

按照man grep

 -q, --quiet, --silent
         Quiet mode: suppress normal output.  grep will only search a file until a match
         has been found, making searches potentially less expensive.
Run Code Online (Sandbox Code Playgroud)

  • `grep -E '^nothing' List.txt | echo $?` 打印在 `grep` 之前执行的命令的退出状态,而不是这个 `grep` 命令。 (2认同)