スクリプトがトランザクションで正常に実行されることを確認する方法

スクリプトがトランザクションで正常に実行されることを確認する方法

次のスクリプトがあるとしましょう。

command1 params
command2 params
command3 params

今私が理解しているように、各コマンドは前のコマンドの戻り状態から独立して実行されます。しかし、私はそれらをすべて単一のトランザクションで実行したいと思います。つまり、前のコマンドが失敗した場合、スクリプトは次のようになります。

  1. 続けてはいけない
  2. 理想的には、前のコマンドで行われた復元操作

最初の質問では、&&演算子を使用してすべてのコマンドをリンクすることができますか、各コマンドの後にifチェックを実行できますが、$?これらの方法は唯一のオプションですか?

2番目の質問に対する標準的なアプローチは何ですか?

ベストアンサー1

コマンドを一緒にリンクするもう1つの方法は、オプションセット(オプションとも呼ばれます)を使用してスクリプト、スクリプトの&&一部、またはサブシェルを実行することです。これにより、スクリプトまたはサブシェルがエラーで終了します。-eset -eerrexit

( set -e
  command1
  command2
  command3 )

すでに実行されている手順をロールバックしている場合、シェルスクリプトではこれが不可能になる可能性があります。

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実行したタスクをロールバックしたり、実行したタスクを再開したり、ファイルの削除を自動的にキャンセルしたりする方法はありません。また、端末の出力もシェルによって制御されず、再度呼び出すことはできません。

おすすめ記事