O :+
é uma forma de expansão de parâmetro :
$ {parâmetro: + [word]} : use valor alternativo.
Se o parâmetro for desabilitado ou nulo, nulo será substituído; caso contrário, a expansão da palavra (ou uma sequência vazia, se a palavra for omitida) deve ser substituída.
Em outras palavras, se a variável $var
for definida, echo ${var:+foo}
será impressa foo
e, se não for, será impressa a sequência vazia.
O segundo :
não é nada de especial. É o caractere usado como um separador na lista de diretórios em $PATH
. Então, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
é uma maneira abreviada de escrever:
if [ -z "$PATH" ]; then
PATH=/usr/local/bin:/usr/bin
else
PATH=/usr/local/bin:/usr/bin:$PATH
fi
É apenas um truque inteligente para evitar adicionar um extra :
quando $PATH
não estiver definido. Por exemplo:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Mas se PATH
não estiver definido:
$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:
A, :
por si só, adiciona o diretório atual ao arquivo $PATH
. O uso PATH="/new/dir${PATH:+:$PATH}"
evita isso. Então, com certeza, você pode usar PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
se quiser, ou PATH="$PATH:/usr/local/bin:/usr/bin"
se preferir. A única diferença é que o primeiro pode adicionar um extra :
, adicionando assim o seu diretório atual ao seu $PATH
.