La :+è una forma di espansione di parametro :
$ {parametro: + [parola]} : usa valore alternativo.
Se il parametro non è impostato o è nullo, è necessario sostituire null; in caso contrario, verrà sostituita l'espansione della parola (o una stringa vuota se la parola viene omessa).
In altre parole, se la variabile $varè definita, echo ${var:+foo}stamperà fooe, in caso contrario, stamperà la stringa vuota.
Il secondo :non è niente di speciale. È il personaggio usato come separatore nell'elenco delle directory in $PATH. Quindi, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"è un modo abbreviato di scrivere:
if [ -z "$PATH" ]; then
PATH=/usr/local/bin:/usr/bin
else
PATH=/usr/local/bin:/usr/bin:$PATH
fi
È solo un trucco intelligente per evitare di aggiungere un extra :quando $PATHnon è impostato. Per esempio:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Ma se PATHnon è impostato:
$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:
A :da solo aggiunge la directory corrente a $PATH. L'uso PATH="/new/dir${PATH:+:$PATH}"evita questo. Quindi certo, puoi usare PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"se vuoi, oppure puoi usare PATH="$PATH:/usr/local/bin:/usr/bin"se preferisci. L'unica differenza è che il primo potrebbe aggiungere un extra :, aggiungendo così la directory corrente alla tua $PATH.