终端 - 为什么即使没有匹配项,grep命令的退出代码仍然是0?

6

我有这个命令:

grep -E '^nothing' List.txt | echo $?

这里grep没有匹配到任何内容,我只是输出了它的退出码。根据grep的文档:

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

但是:

prompt:user$ grep -E '^nothing' List.txt | echo $?
0
prompt:user$

但是,如果没有匹配项,为什么我会得到0作为输出?我应该得到期望的1个退出代码吗?


5
用分号 ; 代替竖线 | - Cyrus
你到底想要实现什么?通常的习惯用法是 if grep -qE '^nothing' list.txt; then ... - tripleee
是的,我正在一个 Bash 脚本中使用 grep。 - tonix
1个回答

4

这是问题:

grep -E '^nothing' List.txt | echo $?

当您使用单个|时,您正在将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.

谢谢您的回复!它有效。只是想澄清一下,当您说“这将始终打印先前命令的退出状态,并且无论是否找到模式,该状态始终为0。”但是如果未找到模式,则grep会以1退出,所以不应该是1吗? - tonix
2
grep -E '^nothing' List.txt | echo $? 打印的是在 grep 命令之前执行的命令的退出状态,而不是这个 grep 命令的退出状态。 - anubhava
好的,谢谢,这就是我需要理解的! - tonix
1
建议在 Posix 兼容性中使用 grep -s 而不是 -q。 - volvox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接