为什么我的命令没有返回" 0"?
grep 'Unable' check_error_output.txt && echo $? | tail -1
如果我删除了回音$?'并使用tail来获得最后一次出现的“无法”#39;在check_error_output.txt中,它正确返回。如果我移除尾部-1,或用&&amp ;;更换管道它按预期返回。
我错过了什么?
答案 0 :(得分:1)
以下方式实现了您在不使用管道或子壳的情况下想要做的事情
grep -q 'Unable' check_error_output.txt && echo $?
-q标志代表安静/无声
从手册页:
安静;不要写任何标准输出。如果发现任何匹配,则立即退出零状态,即使检测到错误也是如此。也 请参阅-s或--no-messages选项。 (-q由POSIX指定。)
这仍然不是故障安全的,因为没有这样的文件或目录"错误仍然会出现两种方式。
我建议采用以下方法,因为它会输出任何类型的返回值:
grep -q 'Unable' check_error_output.txt 2> /dev/null; echo $?
主要区别在于无论是失败还是成功,您仍将获得返回码,错误消息将被定向到/ dev / null。请注意我如何使用";"而不是"&&",使其回显任何类型的返回值。
答案 1 :(得分:0)
使用过程替代:
cat <(grep 'Unable' check_error_output.txt) <(echo $?) | tail -1
答案 2 :(得分:0)
检查if语句中任何命令的返回值的最简单方法是:if cmd; then
。例如:
if grep -q 'Unable' check_error_output.txt; then ...
答案 3 :(得分:-1)
我通过在grep和$附近添加括号来解决这个问题?
(grep 'Unable' check_error_output.txt && echo $?) | tail -1