如何确保脚本作为事务成功运行

如何确保脚本作为事务成功运行

假设我有一个这样的脚本:

command1 params
command2 params
command3 params

现在,据我了解,每个命令都将独立于前一个命令的返回状态运行。但我希望它们全部作为单个事务运行,即如果之前的任何命令使脚本失败:

  1. 不应该继续
  2. 理想情况下恢复以前命令执行的操作

对于第一个问题,我理解,我可以使用&&运算符并将所有命令与它链接起来,或者在每个命令之后进行 if 检查$?,但这些方法是唯一的选择吗?

第二个问题的标准方法是什么?

答案1

将命令链接在一起的另一种方法是使用选项集(有时称为选项)&&来运行脚本、脚本的一部分或子 shell 。这将导致脚本或子 shell 因错误而退出:-eset -eerrexit

( 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 控制,并且无法回调。

相关内容