我有一个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
...
答案 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
以避免不必要地向用户显示消息)