: comando de dos puntos para bash

28

Hablando como un novato bash, he estado actualizando mi .bashrc a través de copiar / pegar + github y me he encontrado con el :comando que nos afecta tanto a mí como a Google. por ej : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Sin esta declaración originalmente en mi .bashrc, y escribiendo estas cosas en mi terminal ( -> indica salida relevante):

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

Y:

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

Pero:

: ${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

No lo entiendo!

1) ¿Cómo establece el comando de dos puntos una variable pero no puede sobrescribir un conjunto export?

2) ¿Cuál es la lógica detrás de usar :en algunos .bashrc?

Usando Mac 10.6.8

(fuera de contexto incluir la palabra clave dos puntos solo para ayudar a otros como yo que intentaron buscar ese término)

sh54
fuente
Vea la excelente respuesta allí stackoverflow.com/questions/10390406/…
Cedric

Respuestas:

45

:es un shell integrado que es básicamente equivalente al truecomando. A menudo se usa como no operativo, por ejemplo, después de una ifdeclaración. Puede leer más al respecto en esta pregunta desde el desbordamiento de la pila .

Los ${varname=value}básicamente significa establecer el valor de $varnamea value, si $varnameno está ya establecido y, a continuación, devuelven el valor de $ nombre_var. Sin embargo, si intenta ejecutar eso en la línea de comando, intentará ejecutar el valor devuelto. Poner el :frente como no operativo evita que bash intente ejecutar el valor.

Tenga en cuenta que hay dos formas ligeramente diferentes:

${varname:=value}

establece varname en valor si varname no está establecido o es nulo.

${varname=value}

solo establece el valor de varname si varname no está configurado actualmente (es decir, no cambiará varname de "" a value)

(Gracias a chepner por aclarar eso en un comentario).

Alguien más hace referencia a este método.

Hamish Downer
fuente