: 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)


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.