쉘 스크립트의 모든 행을 중괄호로 묶는 이유는 무엇입니까?
예를 들어이 스크립트의 전체 내용 중괄호로 묶습니다.
#!/bin/sh
{
set -e
LATEST="v0.3.5"
DGOSS_VER=$GOSS_VER
if [ -z "$GOSS_VER" ]; then
GOSS_VER=${GOSS_VER:-$LATEST}
DGOSS_VER='master'
fi
GOSS_DST=${GOSS_DST:-/usr/local/bin}
INSTALL_LOC="${GOSS_DST%/}/goss"
DGOSS_INSTALL_LOC="${GOSS_DST%/}/dgoss"
touch "$INSTALL_LOC" || { echo "ERROR: Cannot write to $GOSS_DST set GOSS_DST elsewhere or use sudo"; exit 1; }
arch=""
if [ "$(uname -m)" = "x86_64" ]; then
arch="amd64"
else
arch="386"
fi
url="https://github.com/aelsabbahy/goss/releases/download/$GOSS_VER/goss-linux-$arch"
echo "Downloading $url"
curl -L "$url" -o "$INSTALL_LOC"
chmod +rx "$INSTALL_LOC"
echo "Goss $GOSS_VER has been installed to $INSTALL_LOC"
echo "goss --version"
"$INSTALL_LOC" --version
dgoss_url="https://raw.githubusercontent.com/aelsabbahy/goss/$DGOSS_VER/extras/dgoss/dgoss"
echo "Downloading $dgoss_url"
curl -L "$dgoss_url" -o "$DGOSS_INSTALL_LOC"
chmod +rx "$DGOSS_INSTALL_LOC"
echo "dgoss $DGOSS_VER has been installed to $DGOSS_INSTALL_LOC"
}
Shellcheck.net은 중괄호 유무에 관계없이 스크립트가 유효한 것으로 간주합니다.
답변1
이렇게 해야 할 뚜렷한 이유가 없습니다. 중괄호는 스크립트의 나머지 부분과 동일한 환경에서 명령이 실행되는 그룹화 구조입니다.
일반 대괄호라면 서브쉘(나머지 스크립트와 별도의 환경)이겠지만 이 경우에도 큰 차이는 없습니다.
하나가능한그 이유는 작성자가 모든 명령의 모든 출력을 { ... }
다음과 같은 특정 위치로 리디렉션할 수 있기 때문입니다.
{ ...some commands...; } >somefile
그러나 여기서는 분명히 그렇지 않습니다.
괄호 포함,
( ...some commands... )
작성자는 쉘 옵션을 설정하고 스크립트의 나머지 부분에 영향을 주지 않는 로컬 변수를 생성했을 수도 있습니다.