3

What is the reason behind enclosing all lines in a shell script in curly braces?

e.g. the entire content of this script is enclosed in braces:

#!/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 deems the script valid with or without the curly braces.

3

There is no obvious reason to do this. The curly braces is a grouping construct and the commands within them will be executed in the same environment as the rest of the script.

Had it been an ordinary parenthesis, then it would have been a sub-shell (a separate environment from the rest of the script), but in this instance that too would not have made much difference.

One possible reason for this is that it would enable the author to redirect all output from any command within the { ... } to some specific case, as in

{ ...some commands...; } >somefile

but this is obviously not done here.

With parenthesis,

( ...some commands... )

the author would have been able to set shell options and create local variables that don't affect the rest of the script.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.