在 bash 中暂时禁用 'set-e' / 'set -o errexit'?

Temporarily disable 'set-e' / 'set -o errexit' in bash?

我有一个脚本使用 killall 来确保应用程序在启动前尚未 运行:

#!/bin/bash

set -e

some_command
another_command

sudo killall myapp # this causes the script to fail if myapp isn't running
sleep 10
myapp start

但是,如果 myapp 不是 运行,killall 将退出脚本,因为它 returns 是一个错误。

解决此问题的一个方法是暂时禁用 set -o errexit:

#!/bin/bash

set -e

some_command
another_command

set +e
sudo killall myapp # this causes the script to fail if myapp isn't running
set -e
sleep 10
myapp start

不过,上面的做法比较乱。还有哪些其他选项可以暂时禁用 set -e

如果您只想让这个命令以错误结束并认为它是正常的,您可以:

sudo killall myapp || :

:是 bash 中的一个 noop。实际上,上面的行尽可能明确地表达了 "on error do nothing"。您可以使用更惯用的方式实现相同的效果:

sudo killall myapp || true

当然你也可以做其他事情,比如:

sudo killall myapp || echo "Failed to kill Myapp, probably it is not running at the moment." >&2