为啥使用 += 在 bash 中存储命令的退出状态?

Posted

技术标签:

【中文标题】为啥使用 += 在 bash 中存储命令的退出状态?【英文标题】:Why use += to store a command's exit status in bash?为什么使用 += 在 bash 中存储命令的退出状态? 【发布时间】:2020-02-11 13:31:18 【问题描述】:

最近我在 Bash 脚本中遇到了这种模式:

function foo 
  declare -i status=0
  # command(s)
  (( status += $? ))
  return $status

为什么有人会使用+= 来保存退出状态(而不仅仅是status=$?)?

【问题讨论】:

这可以推测,但对我来说作者的意图是对所有退出代码求和然后返回这个和 这取决于上下文。例如当status=256return $status 将与return 0 相同。所以总结所有退出代码并不总是有意义的。另一方面,如果上下文中的所有命令在某些条件下都返回 1,否则返回 0,则 foo 可以用作计数器。 【参考方案1】:

POSIX standard 限制 the exit status code for an application to int。这意味着您可以针对特定错误返回特定代码,例如:

0 - 没有失败 1 - IO 异常 2 - 运行时异常 3 - 高清头部碰撞 等等

但是,如果您的应用程序由于多种原因而崩溃怎么办?传达这一点的一种方法是返回一个类似于the 777 when dealing with permissions 的退出代码的总和:

0 - 没有失败 1 - IO 异常 2 - 运行时异常 4 - 高清头部崩溃

现在,如果你能对异常进行求和,总和会告诉你出了什么问题:

3 = 1 + 2 = IO 异常 + 运行时异常 5 = 1 + 4 = IO 异常 + HD 磁头崩溃 6 = 2 + 4 = 运行时异常 + 高清磁头崩溃 7 = 1 + 2 + 4 = IO 异常 + 运行时异常 + 高清磁头崩溃

这可能是它们返回退出代码总和的原因。

【讨论】:

以上是关于为啥使用 += 在 bash 中存储命令的退出状态?的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中重用最后一个命令的输出

bash 脚本在变量中使用剪切命令并将结果存储在另一个变量中

为啥linux 的 source命令在linux的脚本中没有作用 我使用了#!/bin/sh以及#!/bin/bash 都不好用

Shell中退出状态码exit

为啥 if [ ...something... ];然后回显“退出状态是$?”总是发出 0?

如何在perl脚本中忽略shell命令的退出状态