【问题标题】:With set -e, is it possible to ignore errors for certain commands? [duplicate]使用 set -e,是否可以忽略某些命令的错误? [复制]
【发布时间】:2015-06-26 15:20:38
【问题描述】:

我有一个要全局启用 set -e 的 bash 脚本。

但不是一直禁用它并重新启用它,我想知道是否有一种方法可以选择性地禁用错误处理。 例如,从 systemd 运行的命令可以在前面加上减号以忽略错误。 bash 有没有等价物?

例如

#!/bin/bash

set -e

WAN_IF=eth2

# Ignore error on next line
tc qdisc del dev ${WAN_IF} root

# I want errors to stop the script on this line
tc qdisc add dev ${WAN_IF} root handle 1: htb default 10

...
etc

由于需要启用/禁用很多,我不想继续执行以下操作:

set +e
tc qdisc del dev ${WAN_IF} root

# I want errors to stop the script on this line
set -e
tc qdisc add dev ${WAN_IF} root handle 1: htb default 10
...

【问题讨论】:

  • 我会推荐这个old_set=$-; set +e; <code_returning_exit!=0>; set -$old_set,而不是明确的set -e。以防万一set -e 尚未设置,您不想进行不必要的设置。功能可重复使用。因此,在未设置 set -e 的情况下可能会调用它们。在脚本中可能不需要这种预防措施,但在交互式 shell 中,它可能是相关的。
  • 谢谢@EtanReisner - 你想把它放到答案中,以便其他人可以看到它。效果很好。
  • set -e 的问题不在于您必须小心要允许哪些命令失败。问题是它不组成。如果其他人阅读了这篇文章并使用source yourfile || : 获取此脚本同时允许失败,那么突然yourfile 将不再因错误任何地方而停止。在明确的set -e 之后甚至在失败的行上也没有。

标签: bash shell


【解决方案1】:

在命令末尾添加|| :(或任何其他保证不会失败但最简单的内容)。

尽管很多人会简单地告诉您 set -e 不值得,因为它没有您想象的那么有用(并会导致此类问题),并且手动错误检查是一个更好的策略。

(我还没有加入那个阵营,尽管我遇到的此类问题越多,我想有一天我可能会到达那里。)

从 thatotherguy 的评论中解释了set -e 的主要问题之一:

set -e 的问题不在于您必须小心要允许哪些命令失败。问题是它不组成。如果其他人阅读这篇文章并使用source yourfile || : 获取此脚本同时允许失败,那么突然yourfile 将不再因任何地方的错误而停止。在明确的set -e 之后甚至在失败的行上也没有。

【讨论】:

  • 看到没有人将我的脚本用于其预期目的之外的任何事情,我对这些限制很好。谢谢。
【解决方案2】:

||: 对其所做的事情模棱两可。未来的代码阅读器或未来你可能会感到困惑。显式回显如何:

some_command_allowed_to_fail || (echo "this echo is just to \
    disable the error status" > /dev/null)

(编辑:添加>/dev/null以避免向用户显示不必要的消息)

【讨论】:

  • 关于 ||: 的评论消除了歧义。这就是他们的目的。
猜你喜欢
  • 2020-12-24
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2010-12-08
  • 2014-12-15
  • 2017-04-19
  • 2012-12-22
相关资源
最近更新 更多