【发布时间】: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之后甚至在失败的行上也没有。