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"