在使用其他命令的 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)
不幸的是,这只是捕获消息,不允许我执行除报告之外的任何其他错误处理行为。 grep 浏览此错误消息真的是处理这种情况的最干净的方法吗?
最佳答案
假设您在变量 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
等等。
这对于简单的检查可能就足够了。
在您提到的示例中,您还可以 try catch 文本中的错误代码,[Errno 256]
。为此,您可以使用 perl
单行代码,例如:
echo $ERRORS | perl -n -e'/\[Errno\s*(\d+)\]/ && print $1'
您可以将其与 case
语句结合使用。
关于linux - 动态处理带有二进制返回码的命令的错误报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795794/