次のスクリプトがあるとしましょう。
command1 params
command2 params
command3 params
今私が理解しているように、各コマンドは前のコマンドの戻り状態から独立して実行されます。しかし、私はそれらをすべて単一のトランザクションで実行したいと思います。つまり、前のコマンドが失敗した場合、スクリプトは次のようになります。
- 続けてはいけない
- 理想的には、前のコマンドで行われた復元操作
最初の質問では、&&
演算子を使用してすべてのコマンドをリンクすることができますか、各コマンドの後にifチェックを実行できますが、$?
これらの方法は唯一のオプションですか?
2番目の質問に対する標準的なアプローチは何ですか?
ベストアンサー1
コマンドを一緒にリンクするもう1つの方法は、オプションセット(オプションとも呼ばれます)を使用してスクリプト、スクリプトの&&
一部、またはサブシェルを実行することです。これにより、スクリプトまたはサブシェルがエラーで終了します。-e
set -e
errexit
( 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
実行したタスクをロールバックしたり、実行したタスクを再開したり、ファイルの削除を自動的にキャンセルしたりする方法はありません。また、端末の出力もシェルによって制御されず、再度呼び出すことはできません。