SC2155のベストプラクティス:個別の宣言と割り当て

SC2155のベストプラクティス:個別の宣言と割り当て

bashスクリプトを作成していますが、IDEは次の文について文句を言います。

local grey=$(tput setaf 154)
local red=$(tput setaf 196)
local bold=$(tput bold)
local default=$(tput sgr0)

これが言う内容です:

Declare and assign separately to avoid masking return values.
See SC2155.

この警告が何を意味するのかを理解し、それらを削除することはできますが、最終的なコードは見苦しく見えます。

次のように警告を表示しないことがあります。

# shellcheck disable=SC2155
local grey=$(tput setaf 154)

# shellcheck disable=SC2155
local red=$(tput setaf 196)

# shellcheck disable=SC2155
local bold=$(tput bold)

# shellcheck disable=SC2155
local default=$(tput sgr0)

または、次のように宣言と割り当てを分離できます。

local grey
grey=$(tput setaf 154)

local red
red=$(tput setaf 196)

local bold
bold=$(tput bold)

local default
default=$(tput sgr0)

上記の解決策はあまりにも冗長です。

私もこれを行うことができます:

local grey; grey=$(tput setaf 154)
local red; red=$(tput setaf 196)
local bold; bold=$(tput bold)
local default; default=$(tput sgr0)

しかし、この問題を正しく解決するための最良の方法は何であるかよくわかりません。表情がいいので警告を無視してもいいと思います。きれいで標準に準拠したbashスクリプトを書くための最良の方法は何であるかわかりません。

答え1

「ベストプラクティス」に対する単一の答えはないと思います。私が書く方法はこんな感じです

local grey red bold default
grey=$(tput setaf 154)
red=$(tput setaf 196)
bold=$(tput bold)
default=$(tput sgr0)

同様の宣言をコマンド置換に関連する割り当てと組み合わせない理由は、状態はlocal終了var=$(somecommand)コードですが、somecommand状態はlocal …常にゼロであるためです。したがって、すべてのエラーは非local var=$(somecommand)表示になりますsomecommand。同じ理由で、同じ割り当てに複数のコマンド置換を配置しないでください。

$?もちろん、これは実際にコマンドを確認または開いてコマンドの状態に注意を払う場合にのみ意味がありますset -e

失敗する可能性が低い任意のコマンド(たとえば)を使用することもできますdestination_file=$(dirname -- "$other_file")/$(basename -- "$source_file")tputその一つではありません。要求された機能が不足している端末でスクリプトが実行されると失敗します。

宣言と割り当てを組み合わせないもう一つの理由は、配列ではなくスカラーでのみ機能するためです。宣言をリテラル文字列または数字(local filename='hello.txt'、)とlocal -i n=3組み合わせるだけです。

答え2

-r別の可能性は、(読み取り専用)オプションを提供することですlocal

local -r grey=$(tput setaf 154)
local -r red=$(tput setaf 196)
local -r bold=$(tput bold)
local -r default=$(tput sgr0)

Shellcheckは宣言時に読み取り専用変数を割り当てる必要があるため、これについて文句を言いません。もちろん、これは戻り値がまだ飲み込まれるSC2155の根本的な原因を解決しないので、おそらく「ベストプラクティス」とは言えません。しかし、とにかく戻り値を無視したい場合は問題ありません。

関連情報