假设我有一个这样的脚本:
command1 params
command2 params
command3 params
现在,据我了解,每个命令都将独立于前一个命令的返回状态运行。但我希望它们全部作为单个事务运行,即如果之前的任何命令使脚本失败:
- 不应该继续
- 理想情况下恢复以前命令执行的操作
对于第一个问题,我理解,我可以使用&&
运算符并将所有命令与它链接起来,或者在每个命令之后进行 if 检查$?
,但这些方法是唯一的选择吗?
第二个问题的标准方法是什么?
答案1
将命令链接在一起的另一种方法是使用选项集(有时称为选项)&&
来运行脚本、脚本的一部分或子 shell 。这将导致脚本或子 shell 因错误而退出:-e
set -e
errexit
( set -e
command1
command2
command3 )
至于回滚已经执行的步骤,这在shell脚本中可能是不可能实现的。
exit
以执行系统重新启动,甚至操作磁盘上的数据的脚本为例:
( set -e
if (( $# == 0 )); then
echo "No command line arguments!" >&2
exit
fi
echo "We're cool"
false )
( set -e
case "$cmd" in
restart) sudo reboot ;;
greet) echo "Hi there" ;;
*) echo "Huh?" ;;
esac
false )
( set -e
rm -f /tmp/important_tmp_file
echo "oh oh"
false )
没有任何方法可以回滚exit
已执行的操作,或重新启动已执行的操作,或自动取消删除文件。另请注意,终端的输出也不由 shell 控制,并且无法回调。