gpt4 book ai didi

linux - 动态处理带有二进制返回码的命令的错误报告

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:20 26 4
gpt4 key购买 nike

在使用其他命令的 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)

不幸的是,这只是捕获消息,不允许我执行除报告之外的任何其他错误处理行为。 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 将匹配 ab 等等。

这对于简单的检查可能就足够了。

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

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

您可以将其与 case 语句结合使用。

关于linux - 动态处理带有二进制返回码的命令的错误报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com