本記事は、シェルスクリプトの構文をチェックしてくれる便利なソフトshellcheckにおいて、表題のエラー「SC2029: Note that, unescaped, this expands on the client side.」がどのような時に出るのかについて書いたものです。
shellcheckの注意文
shellcheckは、シェルスクリプトの構文チェックをしてくれる便利なソフトウェアです。これを使用して、以下のような注意が出ることがあります。
SC2029: Note that, unescaped, this expands on the client side.
一見したところなんのことかよくわからなかったので、調べました。「https://github.com/koalaman/shellcheck/wiki/SC2029">SC2029 · koalaman/shellcheck Wiki · GitHub」によると、これはリモートホストで変数を展開したコマンドを実行するときに表示される注意文のようです。
クライアント側の変数かサーバー側の変数化
参考サイトの例文では、以下のコマンドを悪例として示されています。
ssh host "echo $HOSTNAME"
このコマンドは恐らく、リモートホストを表示したいのだろうと思われますが、これを実行すると、実際には $HOSTNAME がクライアント側の変数として展開されてしまい、クライアントのhostnameが表示されてしまいます。これはbashの仕様です。狙った動作をさせるには、この場合$HOSTNAMEの$をエスケープするか、あるいはダブルクォートをシングルクォートにしなければなりません。
さて、今回私のスクリプトでは、以下の状況でこの注意文が表示されました。
ssh hackle@"${hoge}" cat "${file}" >> "${file2}"
変数file はスクリプト内で定義しています。したがって、クライアント側での展開で問題ありません。
If you do want your string expanded on the client side, you can safely ignore this message.
サイトでは以上のように、クライアント側の展開でよければ無視すればいいよ、と書かれていますから、今回この注意メッセージは特に気にする必要はない、ということになります。
まぁ、特に問題になるようなケースではありませんでしたが、bashの変数展開がどのようにされるかについては、よくよく理解しておかねばなりません。色々と気付かせてくれて、shellcheck は便利ですね。
コメント