Shell Terminal-为什么即使找不到匹配项,grep的exit命令也为0?

Shell Terminal-为什么即使找不到匹配项,grep的exit命令也为0?,shell,terminal,grep,exit-code,Shell,Terminal,Grep,Exit Code,我有这个命令: grep -E '^nothing' List.txt | echo $? 这里grep不匹配任何东西,我只是输出它的退出代码。根据grep的文件: 通常,如果选择了一行,则退出状态为0,如果没有行,则退出状态为1 已选择,如果发生错误,则为2。但是,如果-q或 --如果使用quiet或--silent选项并选择一行,则即使发生错误,退出状态也为0。其他grep实现可能会 退出时,错误状态大于2 但是: 但是,为什么即使不存在匹配项,也要将0作为输出,难道我不应该获得预期的1退

我有这个命令:

grep -E '^nothing' List.txt | echo $?
这里grep不匹配任何东西,我只是输出它的退出代码。根据grep的文件:

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

但是:

但是,为什么即使不存在匹配项,也要将0作为输出,难道我不应该获得预期的1退出代码吗?

这就是问题所在:

grep -E '^nothing' List.txt | echo $?
通过使用single
|
grep
的输出发送到
echo
,它将始终打印上一个命令的退出状态,并且无论是否找到模式,该状态都将始终为0

您可以使用
grep-q

grep -qE '^nothing' List.txt
根据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.

|
替换为
。你到底想完成什么?通常的习惯用法是
if grep-qE“^nothing”list.txt;然后…
是的,我正在bash脚本中使用grep谢谢您的回复!它起作用了。只是澄清一下。当您说
时,它将始终打印上一个命令的退出状态,无论是否找到模式,它都将始终为0。
但是如果没有找到模式,greps将以1退出,所以它不应该是一个吗?
grep-E'^nothing'List.txt | echo$?
打印在
grep
之前执行的命令的退出状态,而不是这个
grep
命令。好的,谢谢,这是我需要理解的!对于Posix compat,建议使用grep-s而不是-q。
 -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.