使用set -e,是否可以忽略某些命令的错误?

时间:2015-04-20 03:12:59

标签: bash shell

我有一个bash脚本,我想全局启用set -e。

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

e.g。

#!/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
...

2 个答案:

答案 0 :(得分:5)

|| :(或其他保证不会失败但最简单的事情)添加到命令的末尾。

虽然很多人只是告诉你set -e不值得,因为它并不像你想象的那样有用(并导致这样的问题),手动错误检查更好政策。

(我不在那个阵营中,但是我越是遇到这样的问题,我觉得有一天我可能会到达那里。)

来自thatotherguy的评论解释set -e的主要问题之一:

  

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

答案 1 :(得分:-2)

||:对于正在执行的操作含糊不清。将来的代码阅读器或将来的您可能会感到困惑。显式回声如何:

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

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