将grep输出重定向到/ dev / null有什么意义?


24

考虑这一行:

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

什么是寻找在输出模式如果结果的点被扔掉?

而且,如果这样的行在bash脚本中最后显示,它的退出值是返回给脚本的调用者还是被忽略了?(我正在推测我们是否可以假设这仅是出于副作用而已,还是以某种方式将某些内容返回给调用者。)

Answers:


29

您的怀疑是正确的;脚本的最后一个命令的退出状态将传递到调用环境。因此答案是,如果脚本grep中的数据匹配,此脚本将返回退出状态0,如果不匹配则返回存在状态1,如果发生错误则返回退出状态2。


27

grep丢弃ping输出的要点是,编写者只需要返回状态为grep。他/她只想知道模式是否匹配。就您而言,最后一个grep检查先前命令的输出是否包含以开头的任何行200

在现代POSIX系统中,您可以使用grep -q完成所有操作,而无需重定向到/dev/null

... | grep -q '^200'

请注意,使用grep -q具有较小的副作用,感谢StéphaneChazelas在评论中指出。grep -q找到第一个匹配项licenseTool后立即grep退出,如果退出后仍然写东西,它将收到SIGPIPE。


2
grep -q使用更少的CPU
Skaperen 2015年

5
随着这些事情的发展,它grep -q是最近才添加的;许多脚本仍在使用,> /dev/null因为那是您在冰河时代(即1995年)所拥有的全部。
zwol

3
您的第一句话缺少动词吗?
AL 2015年

在GNU手册页上,“ grep -q”和“ grep> / dev / null”之间的另一个不等价之处是:“但是,如果使用-q或--quiet或--silent并选择了一行,则退出状态为即使发生错误也为0。”
标记

如果文档是正确的“即使发生错误,退出状态也为0” ...我认为该-q选项似乎不合适...因为您希望它通过检查退出状态来了解错误。
Trevor Boyd Smith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.