: Doppelpunktbefehl für Bash

28

Als Bash-Neuling habe ich mein .bashrc über Kopieren / Einfügen + Github aktualisiert und bin auf den :Befehl gestoßen , der mich und Google überfordert . zb : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Ohne diese Anweisung, die ursprünglich in meiner .bashrc-Datei enthalten war und dieses Zeug in mein Terminal eingibt ( -> zeigt relevante Ausgabe an):

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

Und:

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

Aber:

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

Ich verstehe es nicht!

1) Wie setzt der Doppelpunktbefehl eine Variable, kann aber keine Variable überschreiben, die mit festgelegt wurde export?

2) Welche Logik steckt hinter der Verwendung von :.bashrc?

Unter Mac 10.6.8

(Außerhalb des Kontexts enthalten Sie das Schlüsselwort Doppelpunkt, nur um anderen wie mir zu helfen, die versucht haben, nach diesem Begriff zu suchen.)

sh54
quelle
Siehe die ausgezeichnete Antwort dort stackoverflow.com/questions/10390406/…
Cedric

Antworten:

45

:ist eine Shell, die im Prinzip dem trueBefehl entspricht. Es wird oft als No-Op verwendet, z if. B. nach einer Anweisung. Weitere Informationen hierzu finden Sie in dieser Frage unter Stapelüberlauf .

Die ${varname=value}im Grunde Mittel den Wert der $varnamezu , valuewenn $varnamenicht bereits gesetzt ist , und dann den Wert von $ varname zurück. Wenn Sie versuchen, dies in der Befehlszeile auszuführen, wird versucht, den zurückgegebenen Wert auszuführen. Wenn Sie den Anfang :als No-Op markieren, kann Bash nicht versuchen, den Wert auszuführen.

Beachten Sie, dass es zwei leicht unterschiedliche Formen gibt:

${varname:=value}

Setzt varname auf value, wenn varname entweder unset oder null ist.

${varname=value}

Setzt den Wert von varname nur, wenn varname momentan nicht gesetzt ist (dh es ändert varname nicht von "" in value)

(Danke an chepner für die Klarstellung in einem Kommentar).

Jemand anders, der auf diese Methode verweist

Hamish Downer
quelle