如何使用 grep 的 return 状态值?

How to use return status value for grep?

为什么我的命令没有返回“0”?

grep 'Unable' check_error_output.txt && echo $? | tail -1

如果我删除 'echo $?' 并使用 tail 获取 check_error_output.txt 中最后一次出现的 'Unable',它会 returns 正确。如果我删除尾部 -1,或将其替换为 && it returns 预期的管道。

我错过了什么?

我通过在 grep 和 $?

(grep 'Unable' check_error_output.txt && echo $?) | tail -1

使用进程替换:

cat <(grep 'Unable' check_error_output.txt) <(echo $?) | tail -1

以下方法可以在不使用管道或子 shell 的情况下实现您想做的事情

grep -q 'Unable' check_error_output.txt && echo $?

-q 标志代表安静/无声

来自手册页:

Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by POSIX.)

这仍然不是故障安全,因为 "No such file or directory" 错误仍然会出现。

我建议采用以下方法,因为它会输出任一类型的 return 值:

grep -q 'Unable' check_error_output.txt 2> /dev/null; echo $?

主要区别是无论失败还是成功,您仍然会得到 return 代码,错误消息将被定向到 /dev/null。注意我如何使用“;”而不是“&&”,使其回显任一类型的 return 值。

检查 if 语句中任何命令的 return 值的最简单方法是:if cmd; then。例如:

if grep -q 'Unable' check_error_output.txt; then ...