动态处理具有二进制返回代码的命令的错误报告



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

例如:

如果我使用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将匹配ab等。

可能足以进行简单检查。

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

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

您可能与case语句结合。

最新更新