: comando colon para bash

28

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)

sh54
fonte
Veja a excelente resposta lá stackoverflow.com/questions/10390406/…
Cedric

Respostas:

45

:é um shell embutido que é basicamente equivalente ao truecomando. É frequentemente usado como não operacional, por exemplo, após uma ifdeclaração. Você pode ler mais sobre isso nesta questão no estouro de pilha .

Os ${varname=value}significa, basicamente, definir o valor $varnamepara valuese $varnameainda 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:

${varname:=value}

configura varname para value se varname for não definido ou nulo.

${varname=value}

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

Hamish Downer
fonte