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 …항상 0이기 때문입니다. 따라서 모든 오류는 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의 근본 원인을 해결하지는 못하므로 아마도 "모범 사례"라고 할 수는 없을 것입니다. 하지만 어쨌든 반환 값을 무시하고 싶다면 괜찮습니다.

관련 정보