: commande deux-points pour bash

28

En tant que débutant bash, j'ai mis à niveau mon .bashrc via copier / coller + github et je suis tombé sur la :commande qui me bloque et google. par exemple : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Sans cette déclaration à l'origine dans mon .bashrc, et en tapant ce truc dans mon terminal ( -> indique la sortie pertinente):

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> /Users/sh/.bash_completion.d

Et:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf

Mais:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> asdf

Je ne comprends pas!

1) Comment la commande deux-points définit-elle une variable mais ne peut pas en remplacer une par export?

2) Quelle est la logique derrière l'utilisation :de certains .bashrc?

Utilisation de Mac 10.6.8

(hors contexte, inclure le mot-clé deux-points juste pour aider d'autres personnes comme moi qui ont essayé de rechercher ce terme)

sh54
la source
Voir l'excellente réponse là stackoverflow.com/questions/10390406/…
Cedric

Réponses:

45

:est un shell intégré qui est fondamentalement équivalent à la truecommande. Il est souvent utilisé comme no-op, par exemple après une ifdéclaration. Vous pouvez en savoir plus à ce sujet dans cette question sur le débordement de pile .

Les ${varname=value}essentiellement des moyens mis à la valeur de $varnamela valuesi $varnamece n'est déjà, puis retourner la valeur de $ varname. Bien que si vous essayez de l'exécuter sur la ligne de commande, il essaiera d'exécuter la valeur renvoyée. Mettre l' :avant en tant que no-op empêche bash d'essayer d'exécuter la valeur.

Notez qu'il existe deux formes légèrement différentes:

${varname:=value}

définit varname sur une valeur si varname est non défini ou nul.

${varname=value}

ne définit la valeur de varname que si varname est actuellement non défini (c'est-à-dire qu'il ne changera pas varname de "" en valeur)

(Merci à chepner d'avoir clarifié cela dans un commentaire).

Quelqu'un d'autre référençant cette méthode

Hamish Downer
la source