我看到一个 shell 脚本中有这样一行代码:
grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null
if [ $? -eq 0 ]
我看到一个 shell 脚本中有这样一行代码:
grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null
if [ $? -eq 0 ]
$?
是最近执行的命令的退出状态码;按照惯例,0表示成功,其他任何值表示失败。该行代码用于检查grep
命令是否成功。
grep
的man页面说明:
如果找到所选行,则退出状态为0,如果未找到,则为1。如果发生错误,则退出状态为2。(注意:POSIX错误处理代码应检查是否为'2'或更大。)
因此,在这种情况下,它检查是否找到了任何ERROR行。
代码正在检查 grep
的返回值($?
)。在这种情况下,它正在将其与0(成功)进行比较。
通常当你看到像这样的东西(检查grep的返回值)时,它是在检查特定字符串是否被检测到。虽然将其重定向到 /dev/null
不是必要的,但可以使用 -q
来实现相同的效果。
/dev/null
是一种特殊的“黑洞”文件,当你向其中写入数据时,这些数据会被直接丢弃。使用它是一种经典的方法来阻止程序将输出打印到屏幕上。 - Chris Eberle/dev/null
意思是“空设备”。当我想到/dev/null
实际上是什么时,它似乎并不是一个很好的用户名选择。 - Daniel Haley这是一种极度过时的检查命令成功或失败的方法。通常,您所给出的代码片段将被重构为:
if grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null; then
...
fi
(虽然在某些情况下可以使用'grep -q'而不是重定向到/dev/null,但这样做并不具有可移植性。许多grep实现不支持-q选项,因此如果您使用它,您的脚本可能会失败。)