加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 为什么测试“$?”来查看命令是否成功,反模式?

发布时间:2020-12-15 22:43:38 所属栏目:安全 来源:网络整理
导读:我看到 here测试是否$?是零(成功)或其他东西(失败)是反模式,但我无法在其他任何地方找到它. 坚持Wikipedia反模式的定义:“反模式(或反模式)是对反复出现的问题的常见反应,这种反复出现的问题通常是无效的,并且可能会产生极大的反作用.”为什么这会是反模式
我看到 here测试是否$?是零(成功)或其他东西(失败)是反模式,但我无法在其他任何地方找到它.

坚持Wikipedia反模式的定义:“反模式(或反模式)是对反复出现的问题的常见反应,这种反复出现的问题通常是无效的,并且可能会产生极大的反作用.”为什么这会是反模式?

解决方法

这是一个反模式,因为如果您根本不需要记录退出状态,它会引入不存在的复杂性.

if your_command; then ...

比错误要少得多

your_command
if [ "$?" -eq 0 ]; then ...

有关可能出错的事例:考虑traps,甚至添加新的echo语句进行调试,修改$?.对于读者来说,在不改变逻辑流的情况下,运行your_command的单独行不能在其下面添加任何内容,这在视觉上并不明显.

那是:

your_command
echo "Finished running your_command" >&2
if [ "$?" -eq 0 ]; then ...

…正在检查回声,而不是实际命令.

因此,如果您确实需要以更精细的方式处理退出状态,而不是立即分支它的值是否为零,则应该在同一行上收集它:

# whitelisting a nonzero value for an example of when "if your_command" won't do.
your_command; your_command_retval=$?
echo "Finished running your_command" >&2 ## now,adding more logging won't break the logic.
case $your_command_retval in
  0|2) echo "your_command exited in an acceptable way" >&2;;
  *)   echo "your_command exited in an unacceptable way" >&2;;
esac

最后:如果将your_command包含在if语句中,则会将其标记为已测试,以便shell出于set -e或ERR陷阱的目的不会考虑非零退出状态.

从而:

set -e
your_command
if [ "$?" -eq 0 ]; then ...

……永远不会(除了一些困扰设置-e行为的角落案例和警告)到达任何价值为$的if语句?除了0之外,因为set -e将在这种情况下强制退出.相比之下:

set -e
if your_command; then ...

…将your_command的退出状态标记为已测试,因此不会将其视为强制脚本按set -e退出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读