状況
古いリリースを片付けるスクリプトを、本番に入れる前にレビューしている。
このスクリプトで最初に止めるべき点は?
#!/bin/bashRELEASE_DIR=/opt/app/releasescd $RELEASE_DIR/oldrm -rf ./*正答
- ./* では隠しファイルが消えないので、.[!.]* も指定すべき
- 変数は ${RELEASE_DIR} と波括弧で囲まないと展開されない
- #!/bin/sh にしないと、cron から実行したときに動かない
- cd が失敗しても rm が実行され、今いるディレクトリの中身が消える
解説
old ディレクトリが既に無い、名前が違うなどで cd が失敗しても、bash は既定で次の行に進む。rm -rf ./* はスクリプトを起動した場所、たとえば cron ならホームディレクトリの中身を消す。cd "$RELEASE_DIR/old" || exit 1 とするか set -e を付け、rm には絶対パスを渡す。隠しファイルの消し残しは事実だが、別の場所を消す危険に比べれば小さい。この位置の変数は波括弧なしでも展開される。
参考: www.gnu.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ