ShellScriptでの事故防止としてShellCheckを適用してみた
ShellScriptの誤動作をチェックするためにShellCheckでLintを掛けてみました。兎に角Warningsを解消するのが大変でしたが、事故を防ぐには有効だと思います。
Linterを用いてのチェックを行う場合、個人的に一番厄介なのはシェルスクリプト。いずれの環境でも問題なく動かせることを見送るとしても、それでもWarning表示がなかなか消えません。
ShellCheckを使った、OSX環境でのWarning対処として実践してみたことについて書いてみました。
ShellCheck環境の設定
ShellCheckを有効にしておきます。
brew install shellcheck
この記事での実行は coc-diagnostic
にて。
:CocInstall coc-diagnostic
とあるスクリプトのWarning潰し
よくあるシェルスクリプトもWarningの宝庫です。
#!/bin/sh CURRENT=$(cd $(dirname $0) && pwd) cd $CURRENT
ポイントは一行に複数のWarning表示が含まれているところ。今回該当したチェックポイントは以下の通り。
- SC2086: Double quote to prevent globbing and word splitting
- SC2046: Quote this to prevent word splitting
- SC2164: Use 'cd … || exit' or 'cd … || return' in case cd fails
Warningが出ないように修正をいれます。
#!/bin/sh CURRENT="$(cd "$(dirname "$0")" && pwd)" cd "$CURRENT" || exit
処理の中断を防ぐために1行目にはダブルクオーテーションを適用し(SC2046 & SC2086)、2行目も同じくダブルクォーテーションを適用しつつ(SC2086)、想定外の箇所への移動を防ぐため分岐で中断するようにします(SC2164)。
適用するLintの限定
全般で指定したい場合は .shellcheckrc
にて。
% cat ~/.shellcheckrc disable=SC2164
特定のスクリプトファイル限定でLintを外したい場合は、シェルスクリプト内でIDを指定します。
#!/bin/sh # shellcheck disable=SC2164 CURRENT=$(cd $(dirname $0) && pwd) cd $CURRENT
GitHub Actionsでの導入
手間を掛けずに定期チェックする場合は以下のActionを使う手もあります。
- name: Run ShellCheck uses: ludeeus/action-shellcheck@master env: SHELLCHECK_OPTS: -e SC2059 -e SC2034 -e SC1090
あとがき
厳密に適用を考え始めると、相当な手直しが発生するはずです。優先して対処したいのは、不測の場所での処理が誤実行されるケースでしょうか。可能であればCICD等を通してLintをいれておきましょう。