使用二进制返回码动态处理命令的错误报告

时间:2017-12-13 14:45:49

标签: linux bash error-handling

在使用其他命令的bash脚本中,我理解我可以使用$?捕获所述命令的返回码。虽然此方法通常会让我知道命令是成功0还是失败!0,但在命令可能只有两个退出代码为1的情况下,它不会向我提供更多详细信息和0

例如:

如果我在linux中使用reposync命令,我可能会让命令成功并返回0,但如果由于网络断开而失败,它将返回{{1}尽管1返回了更多错误:

stdout

同样,如果由于GPG签名验证失败而删除了一个包(假设使用了[<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. 标志),它也将返回1

所以我的问题是:从bash脚本中,我应该如何对带有二进制退出代码的命令进行错误处理?

最初我的想法是将错误输出重定向到字符串以相应地处理错误消息:

--gpgcheck

不幸的是,这只是捕获消息并且除了报告之外不允许我执行任何其他错误处理行为。是否真的是处理这种情况的最简洁方法?

1 个答案:

答案 0 :(得分:0)

假设您在变量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将匹配ab,依此类推。

这可能足以进行简单的检查。

在您提到的示例中,您还可以尝试捕获文本[Errno 256]中的错误代码。为此,您可以使用perl单行代码:

echo $ERRORS | perl -n -e'/\[Errno\s*(\d+)\]/ && print $1'

您可以将其与case声明结合使用。