Двоеточие в начале строки в скрипте Docker entrypoint bash [дубликат]
этот вопрос уже есть ответ здесь:
- какова цель: (двоеточие) GNU Bash builtin? 11 ответов
Я смотрел через сценарий 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...