: comando de dois pontos para o bash

22

Falando como um novato bash eu tenho atualizado o meu .bashrc via copy / paste + github e me deparei com o comando : que tropeça tanto eu quanto o google. por exemplo. : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d} .

Sem esta declaração originalmente no meu .bashrc, e digitando essas coisas no meu terminal ( - > indica a 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 de dois pontos define uma variável, mas não pode sobrescrever um conjunto por export ?

2) Qual é a lógica por trás do uso de : em alguns .bashrc?

Usando o Mac 10.6.8

(fora do contexto incluem a palavra-chave cólon apenas para ajudar outras pessoas como eu que tentaram pesquisar por esse termo)

    
por sh54 13.05.2012 / 15:24

1 resposta

34

: é um shell embutido que é basicamente equivalente ao comando true . É frequentemente usado como um não operacional, por exemplo, após uma instrução if . Você pode ler mais sobre isso em esta pergunta do estouro de pilha .

O ${varname=value} basicamente significa definir o valor de $varname para value se $varname ainda não estiver definido e, em seguida, retornar o valor de $ varname. Porém, se você tentar executar isso na linha de comando, ele tentará executar o valor retornado. Colocar o : na frente como não-operante evita que o bash tente executar o valor.

Note que existem duas formas ligeiramente diferentes:

${varname:=value}

define varname para value se varname não estiver definido ou nulo.

${varname=value}

define apenas o valor de varname se varname não estiver definido no momento (ou seja, ele não alterará varname de "" para value)

(Obrigado a chepner por esclarecer isso em um comentário).

Alguém referenciando este método

    
por 13.05.2012 / 16:12

Tags