Que signifie $ {PATH: +: $ {PATH}}?

J'ai récemment remarqué ce qui suit dans mon profil cygwin, plus précisément:

/usr/local/bin:/usr/bin${PATH:+:${PATH}} 

Qu'est-ce que ça veut dire? Pourquoi ne pas seulement $ PATH? Est-ce un 'si $ PATH existe alors ajoutez: $ PATH'? Mon but est d'échanger l'ordre et de mettre les paths cygwin derrière le path des windows. Dans le passé j'aurais

 $PATH:/usr/local/bin:/usr/bin 

mais cela me confond. Peut-être que je devrais faire

 PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin" 

append le: à la fin du $ PATH?

Le :+ est une forme d' expansion de paramètre :

$ {paramètre: + [mot]} : Utilisez la valeur alternative.

Si le paramètre est désactivé ou nul, null doit être remplacé; sinon, l'extension du mot (ou une string vide si le mot est omis) doit être remplacée.

En d'autres termes, si la variable $var est définie, echo ${var:+foo} imprimera foo et, dans le cas contraire, imprimera la string vide.

Le second : n'a rien de spécial. C'est le caractère utilisé comme séparateur dans la list des directorys dans $PATH . Ainsi, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}" est une écriture abrégée:

 if [ -z "$PATH" ]; then PATH=/usr/local/bin:/usr/bin else PATH=/usr/local/bin:/usr/bin:$PATH fi 

C'est juste une astuce intelligente pour éviter d'append un supplément : lorsque $PATH n'est pas défini. Par exemple:

 $ PATH="/usr/bin" $ PATH="/new/dir:$PATH" ## Add a directory $ echo "$PATH" /new/dir:/usr/bin 

Mais si PATH est désactivé:

 $ unset PATH $ PATH="/new/dir:$PATH" $ echo "$PATH" /new/dir: 

A : par lui-même ajoute le directory courant au $PATH . En utilisant PATH="/new/dir${PATH:+:$PATH}" évite cela. Si vous le souhaitez, vous pouvez utiliser PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin" PATH="$PATH:/usr/local/bin:/usr/bin" si vous préférez. La seule différence est que le premier peut append un supplément:, ajoutant ainsi votre directory actuel à votre $PATH .

Vous avez raison, cela signifie 'si $ PATH existe – et n'est pas nul – alors ajoutez: $ PATH'.

Vous devez vérifier si $ PATH existe parce que vous ne voulez pas append les deux points de début (ou de fin) si $ PATH est indéfini. Un nom de directory de longueur nulle (null) dans le path d'access, comme dans :/usr/local/bin:/usr/bin ou /usr/local/bin:/usr/bin: /usr/local/bin::/usr/bin , signifie searchr dans le directory courant .

Extrait de l' man bash :

  PATH ... A zero-length (null) directory name in the value of PATH indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon. ... 

Ce n'est probablement pas ce que vous voulez faire.

Les deux lignes suivantes font la même chose:

 PATH=":/bin" # search current directory, then /bin PATH=".:/bin"