そもそも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)"
冗長な書き方に見えますが、シェルスクリプトの特性上安全な書き方ということですね。