: perintah titik dua untuk bash

28

Berbicara sebagai pemula bash saya telah memutakhirkan .bashrc saya melalui copy / paste + github dan saya telah menemukan :perintah yang membingungkan saya dan google. mis : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Tanpa pernyataan ini awalnya di .bashrc saya, dan mengetikkan hal ini ke terminal saya ( -> menunjukkan output yang relevan):

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

Dan:

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

Tapi:

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

Saya tidak mengerti!

1) Bagaimana perintah titik dua mengatur variabel tetapi tidak dapat menimpa satu set oleh export?

2) Apa logika di balik penggunaan :dalam beberapa .bashrc?

Menggunakan Mac 10.6.8

(di luar konteks termasuk kata kunci usus hanya untuk membantu orang lain seperti saya yang mencoba mencari istilah itu)

sh54
sumber
Lihat jawaban yang bagus di sana stackoverflow.com/questions/10390406/…
Cedric

Jawaban:

45

:adalah shell builtin yang pada dasarnya setara dengan trueperintah. Ini sering digunakan sebagai no-op misalnya setelah ifpernyataan. Anda dapat membaca lebih lanjut tentang hal ini dalam pertanyaan ini dari stack overflow .

Pada ${varname=value}dasarnya berarti mengatur nilai $varnameke valuejika $varnamebelum ditetapkan, dan kemudian mengembalikan nilai $ varname. Meskipun jika Anda mencoba menjalankannya di baris perintah, ia akan mencoba menjalankan nilai yang dikembalikan. Menempatkan :di depan sebagai larangan mencegah bash mencoba menjalankan nilai.

Perhatikan ada dua bentuk yang sedikit berbeda:

${varname:=value}

set varname ke nilai jika varname tidak disetel atau null.

${varname=value}

hanya menetapkan nilai varname jika varname saat ini tidak disetel (mis., itu tidak akan mengubah varname dari "" ke nilai)

(Terima kasih kepada chepner untuk mengklarifikasi hal itu dalam komentar).

Orang lain yang mereferensikan metode ini

Hamish Downer
sumber