O :+
é uma forma de expansão de parâmetros :
${parameter:+[word]} : Use Alternative Value.
If parameter is unset or null, null shall be substituted; otherwise, the expansion of word (or an empty string if word is omitted) shall be substituted.
Em outras palavras, se a variável $var
for definida, echo ${var:+foo}
imprimirá foo
e, se não for, imprimirá a string vazia.
O segundo :
não é nada 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 forma 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 está 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:
Um :
por si só adiciona o diretório atual ao $PATH
. Usar PATH="/new/dir${PATH:+:$PATH}"
evita isso. Então, você pode usar PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
se quiser, ou você pode usar PATH="$PATH:/usr/local/bin:/usr/bin"
se preferir. A única diferença é que o primeiro pode adicionar um :
extra, adicionando assim seu diretório atual ao seu $PATH
.