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