在 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
我有一个脚本使用 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