Falando como um novato no bash, eu atualizei meu .bashrc via copy / paste + github e me deparei com o :
comando que desconfia tanto de mim quanto do google. por exemplo : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}
.
Sem essa declaração originalmente no meu .bashrc e digitando essas coisas no meu terminal ( -> indica saída relevante):
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> /Users/sh/.bash_completion.d
E:
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf
Mas:
: ${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
Eu não entendi!
1) Como o comando dois pontos define uma variável, mas não pode sobrescrever uma definida por export
?
2) Qual é a lógica por trás do uso :
em alguns arquivos .bashrc?
Usando o Mac 10.6.8
(fora do contexto, inclua a palavra-chave dois pontos apenas para ajudar outras pessoas como eu que tentaram pesquisar esse termo)
Respostas:
:
é um shell embutido que é basicamente equivalente aotrue
comando. É frequentemente usado como não operacional, por exemplo, após umaif
declaração. Você pode ler mais sobre isso nesta questão no estouro de pilha .Os
${varname=value}
significa, basicamente, definir o valor$varname
paravalue
se$varname
ainda não estiver definida, em seguida, retornar o valor de US $ varname. Embora se você tentar executar isso na linha de comando, ele tentará executar o valor retornado. Colocar o:
na frente como um não-op impede que o bash tente executar o valor.Observe que existem duas formas ligeiramente diferentes:
configura varname para value se varname for não definido ou nulo.
somente define o valor do varname se o nome do var não estiver definido no momento (ou seja, ele não mudará o nome do var "de" "para o valor)
(Obrigado ao chepner por esclarecer isso em um comentário).
Alguém mais referenciando esse método
fonte