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 .