23

Говоря как новичок в 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

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

1 ответ1

37

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

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

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

${varname:=value}

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

${varname=value}

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .