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

Chr*_*now 3 linux bash ubuntu

我有一个脚本用于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
Run Code Online (Sandbox Code Playgroud)

但是,如果myapp未运行,killall将退出脚本,因为它返回错误.

解决此问题的一个选项是暂时禁用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
Run Code Online (Sandbox Code Playgroud)

但是,上述方法相当混乱.还有哪些其他选项暂时禁用set -e

sba*_*ski 10

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

sudo killall myapp || :
Run Code Online (Sandbox Code Playgroud)

:是bash中的noop.有效地,上面的行尽可能明确地表达"在错误上无所作为".你可以用更多的惯用语来达到同样的效果:

sudo killall myapp || true
Run Code Online (Sandbox Code Playgroud)

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

sudo killall myapp || echo "Failed to kill Myapp, probably it is not running at the moment." >&2
Run Code Online (Sandbox Code Playgroud)