在使用其他命令的bash脚本中,我知道我可以使用 $?
捕获所述命令的返回代码。虽然此方法通常可以让我知道命令是成功的0
还是失败的!0
,但在命令中只有两个退出代码为1
和0
的情况下,它并不能为我提供更多详细信息。
例如:
如果我使用Linux中的reposync
命令,我可能会成功并返回0
,但是如果由于已断开网络而失败,它将返回1
,尽管stdout
返回了更多错误:
[<reponame>: <repo_number> of <total_repos> ] Downloading <package>
Could not retrieve package <package> Error was failure: getPackage/<package>: [Errno 256] No more mirrors to try.
同样,如果由于GPG签名验证失败(假设使用了--gpgcheck
标志),则它也将返回1
。
所以我的问题是:从bash脚本中,我应该如何在使用二进制出口代码的命令上进行错误处理?
最初,我的想法是将错误输出重定向到字符串以相应处理错误消息:
ERRORS=$( reposync 2>&1)
不幸的是,这只是捕获了该消息,除了报告外,我不允许我进行其他错误处理行为。通过此错误消息,Greppphing是否真的是处理此情况的最干净的方法?
假设您在变量ERRORS
中有错误文本,则可以使用case
检查某些简单案例:
case "$ERRORS" in
*<string>*)
# Code for error that contains <string>
;;
*<string2>*)
# Code for error that contains <string2>
;;
*)
# None matched
;;
esac
case
指令(请参阅BASH)让您使用模式。例如,*
将与任何事物匹配;a|b
将匹配a
或b
等。
可能足以进行简单检查。
在您提到的示例中,您也可以尝试捕获文本中的错误代码[Errno 256]
。为此,您可能会使用perl
单线仪,例如:
echo $ERRORS | perl -n -e'/[Errnos*(d+)]/ && print $1'
您可能与case
语句结合。