Двоеточие в начале строки в скрипте Docker entrypoint bash [дубликат]

этот вопрос уже есть ответ здесь:

Я смотрел через сценарий entrypoint для изображения docker и у них были следующие строки (53-54)

: ${POSTGRES_USER:=postgres}
: ${POSTGRES_DB:=$POSTGRES_USER}

Я видел эту ветку какова цель из : (двоеточие) GNU Bash builtin?

и смог выяснить : означало true и что := использовался для присвоения значений по умолчанию, но он действительно не затрагивает то, что делает : в начале строки, по крайней мере для данного конкретного случая.

1 ответов


в оболочке Борна и производных, таких как Bash,: - это команда no-op: то есть она ничего не делает, но аргументы оцениваются нормально. Сравните это с комментарием (#), который вообще ничего не делает (все, что следует за # просто игнорируется).

синтаксис:

: ${POSTGRES_USER:=postgres}

обычно используется для присвоения значений по умолчанию для переменных. Синтаксис ${POSTGRES_USER:=postgres} (a) установит переменную POSTGRES_USER to postgres только если это уже не имеет значения, а затем будет (b) оценивать значение $POSTGRES_USER. Если мы использовали комментарий:

# ${POSTGRES_USER:=postgres}

...ничего не произойдет, потому что оболочка просто игнорирует всю линию. Используя : означает, что ${...} выражение все еще оценивается, поэтому POSTGRES_USER при необходимости присваивается значение.

обновление

если бы не было : в начале строки, затем это:

${POSTGRES_USER:=postgres}

будет командой оболочки! Оболочка сначала оценит расширение переменной и придумает что-то вроде postgres, поэтому у вас будет сценарий оболочки, который эффективно выглядел бы так:

postgres

что, вероятно, даст вам ошибку:

bash: postgres: command not found...