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

标签 linux bash error-handling

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

相关文章:

ruby - 从数组ruby删除所有元素并引发错误

java - 在Linux服务器上安装java

linux - 为什么 php 进程在那里挂了将近 3 个月?

linux - 如何将文件从服务器移动到 FTP 备份存储?

bash - 解压缩 - 警告和 map 名称

bash - 如何在 bash 打印中打印粗体和大小文本

python - Python-如何在两个方向上对自己的类执行操作?

Linux IP 别名 : how to setup Apache listen IP to be source IP for the same destination

javascript - 如何使用node编写一个shell脚本来依次运行多个javascript文件?

php - 如何在 PHP 中捕获 require() 或 include() 的错误?