: polecenie dwukropka dla bash

28

Mówiąc jak nowicjusz, uaktualniłem swój .bashrc przez copy / paste + github i natrafiłem na :polecenie, które zaskakuje zarówno mnie, jak i google. np : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Bez tej instrukcji oryginalnie w moim .bashrc i wpisanie tych rzeczy w moim terminalu ( -> oznacza odpowiednie dane wyjściowe):

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

I:

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

Ale:

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

Nie rozumiem

1) W jaki sposób polecenie dwukropek ustawia zmienną, ale nie może zastąpić zestawu przez export?

2) Jaka jest logika używania :niektórych plików .bashrc?

Na komputerze Mac 10.6.8

(poza kontekstem obejmuje dwukropek słów kluczowych, aby pomóc innym osobom, takim jak ja, które próbowały wyszukać ten termin)

sh54
źródło
Zobacz doskonałą odpowiedź stackoverflow.com/questions/10390406/…
Cedric,

Odpowiedzi:

45

:jest wbudowaną powłoką, która jest w zasadzie odpowiednikiem truepolecenia. Jest często używany jako brak op, np. Po ifwyciągu. Możesz przeczytać więcej na ten temat w tym pytaniu z przepełnienia stosu .

W ${varname=value}zasadzie oznacza ustawić wartość $varnamena valuerazie $varnamenie jest już ustawiony, a następnie zwraca wartość $ nazwa_zmiennej. Chociaż jeśli spróbujesz uruchomić to z wiersza poleceń, spróbuje uruchomić zwróconą wartość. Umieszczenie z :przodu jako no-op zapobiega próbie uruchomienia wartości przez bash.

Uwaga: istnieją dwie nieznacznie różne formy:

${varname:=value}

ustawia zmienną na wartość, jeśli zmienna jest ustawiona lub pusta.

${varname=value}

ustawia wartość zmiennej tylko wtedy, gdy zmienna jest obecnie rozbrojona (tzn. nie zmieni wartości zmiennej z „” na wartość)

(Dziękuję chepnerowi za wyjaśnienie tego w komentarzu).

Ktoś jeszcze odwołuje się do tej metody

Hamish Downer
źródło