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 $varfor definida, echo ${var:+foo}será impressa fooe, 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 $PATHnão estiver definido. Por exemplo:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Mas se PATHnã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.