: команда двоеточия для Баш

28

Говоря как новичок в bash, я обновлял свой .bashrc через copy / paste + github, и я столкнулся с :командой, которая ставит меня в тупик и google. например : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Без этого утверждения изначально в моем .bashrc и ввода этого материала в мой терминал ( -> указывает на соответствующий вывод):

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

А также:

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

Но:

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

Я не понимаю!

1) Как команда двоеточия устанавливает переменную, но не может перезаписать переменную export?

2) Какова логика использования :в некоторых .bashrc?

Использование Mac 10.6.8

(вне контекста включает ключевое слово двоеточие, чтобы помочь другим, таким как я, которые пытались найти этот термин)

sh54
источник
Смотрите отличный ответ там stackoverflow.com/questions/10390406/…
Седрик

Ответы:

45

:это встроенная оболочка, которая в основном эквивалентна trueкоманде Он часто используется в качестве запрета, например, после ifзаявления. Вы можете прочитать больше об этом в этом вопросе из переполнения стека .

В ${varname=value}основном это означает , установить значение $varnameдля valueесли $varnameеще не установлен, а затем возвращает значение $ перем. Хотя, если вы попытаетесь запустить это в командной строке, он попытается запустить возвращаемое значение. Помещение :переднего как неоперативное предотвращает попытку запуска значения bash.

Обратите внимание, что есть две слегка разные формы:

${varname:=value}

устанавливает значение переменной varname, если переменная либо не установлена, либо равна нулю.

${varname=value}

устанавливает значение переменной varname только в том случае, если переменная в данный момент не установлена ​​(т. е. она не изменит varname с "" на значение)

(Спасибо Чепнеру за разъяснение этого в комментарии).

Кто-то еще ссылается на этот метод

Хэмиш Даунер
источник