危険察知4 択難易度 標準

状況

古いリリースを片付けるスクリプトを、本番に入れる前にレビューしている。

このスクリプトで最初に止めるべき点は?

#!/bin/bashRELEASE_DIR=/opt/app/releasescd $RELEASE_DIR/oldrm -rf ./*

正答

  1. ./* では隠しファイルが消えないので、.[!.]* も指定すべき
  2. 変数は ${RELEASE_DIR} と波括弧で囲まないと展開されない
  3. #!/bin/sh にしないと、cron から実行したときに動かない
  4. cd が失敗しても rm が実行され、今いるディレクトリの中身が消える

解説

old ディレクトリが既に無い、名前が違うなどで cd が失敗しても、bash は既定で次の行に進む。rm -rf ./* はスクリプトを起動した場所、たとえば cron ならホームディレクトリの中身を消す。cd "$RELEASE_DIR/old" || exit 1 とするか set -e を付け、rm には絶対パスを渡す。隠しファイルの消し残しは事実だが、別の場所を消す危険に比べれば小さい。この位置の変数は波括弧なしでも展開される。

参考: www.gnu.org

bashcdrm

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ