Introduction

京都大学でバックアップデータが消失した件
ヒューレット・パッカードが 100% 責任を認めた事件だが、なんで発生したのかというと

  1. バックアップスクリプトを実行
  2. スクリプトの機能改善と併せてコードの視認性や可読性を高めるため、findコマンドの検索・削除処理に渡す変数名を変更
  3. 上書きしたスクリプトの再読み込みが発生し、未定義の変数が含まれたfindコマンドが実行
  4. 未定義の変数により意図しないディレクトリが find の対象になり、重大データが削除された

で、方々で問題になったが、取り急ぎ対策としては、実行中にスクリプトを修正しないのもあるが、未定義の変数が発生した場合処理を止めることができないか、という点。
結論から言えば可能で、ネット上で指摘されていた対策。

How to

下記で対応。

1
2
#!/usr/env bash
set -u

これでOK。
他にも

1
2
# パイプやサブシェルで実行したコマンドが1つでもエラーになったら直ちにシェルを終了
set -e

とか

1
2
# パイプラインでエラーになったらシェルを終了
set -o pipefail

もあるとより安全らしい