一般社団法人 全国個人事業主支援協会

COLUMN コラム

  • ShellCheckのSC2155が気になった

そもそもShellCheckとは?
ShellCheckは

シェルスクリプトに対する静的解析ツール

IntelliJのCheckstyleのように、シェルスクリプトに対して警告や提案などを行うツールになります。

SC2155とは?
SC2155は以下のような記述を行った際に出る警告です。
local foo = "$(bar)"
これはfooというローカル変数にbarという関数の実行結果を代入する処理になります。
Javaなどを触っていると、結構当たり前のような書き方だと思います。
ですが、シェルスクリプトにおいては警告対象となります。

なぜ警告対象なのか
[公式ドキュメント](https://www.shellcheck.net/wiki/SC2155)によると、

The exit status of the command is overridden by the exit status of the creation of the local variable. For example:

$ f() { local foo=$(false) && echo "error was hidden"; }; f
error was hidden
$ f() { local foo; foo=$(false) && echo "error was hidden"; }; f

つまり、関数の終了コードがローカル変数foo生成の終了コードで上書きされてしまうのです。
Javaでは異常終了は例外として扱われるので、このようなことは意識してこなかったため、
警告対象となる理由を知って、「なるほど!」となりました。

正しい記述は?
以下のように記述するのが正しい書き方のようです。
local foo
foo = "$(bar)"

冗長な書き方に見えますが、シェルスクリプトの特性上安全な書き方ということですね。

The following two tabs change content below.

住井 亮平

最新記事 by 住井 亮平 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア