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

Mat*_*att 8 bash shell

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

但是不是一直禁用它并重新启用它,我想知道是否有一种方法可以选择性地禁用错误处理.例如,从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
Run Code Online (Sandbox Code Playgroud)

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

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
...
Run Code Online (Sandbox Code Playgroud)

Eta*_*ner 6

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

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

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

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

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