ShellScriptでの事故防止としてShellCheckを適用してみた

ShellScriptの誤動作をチェックするためにShellCheckでLintを掛けてみました。兎に角Warningsを解消するのが大変でしたが、事故を防ぐには有効だと思います。
2021.07.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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表示が含まれているところ。今回該当したチェックポイントは以下の通り。

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をいれておきましょう。