在docker入口点bash脚本的行开头的冒号

时间:2015-09-02 00:22:13

标签: bash docker

我正在查看an entrypoint script for a docker image,他们有以下几行(53-54)

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

我看到了这个帖子What is the purpose of the : (colon) GNU Bash builtin?

并且能够发现:意味着真实并且:=用于指定默认值,但它并没有真正触及:处的内容至少对于这个特定情况,该行的开头。

1 个答案:

答案 0 :(得分:34)

在Bourne shell和像Bash这样的派生类中,:是一个无操作命令:也就是说,它不会执行任何操作,但会正常评估参数。将其与评论(#)进行对比,评论完全不做任何事情(仅忽略#之后的评论)。

此语法:

: ${POSTGRES_USER:=postgres}

通常用于为变量指定默认值。语法${POSTGRES_USER:=postgres}(a)将变量POSTGRES_USER设置为postgres ,只有它还没有值,然后(b)评估为$POSTGRES_USER的值。如果我们使用评论:

# ${POSTGRES_USER:=postgres}

......什么都不会发生,因为shell只是忽略整行。使用:表示仍会评估${...}表达式,因此如果需要,会为POSTGRES_USER分配一个值。

<强>更新

如果该行的开头没有:,那么:

${POSTGRES_USER:=postgres}

将是一个shell命令! shell会首先评估变量扩展并提出像postgres这样的东西,所以你会有一个有效的shell脚本:

postgres

哪个可能会给你错误:

bash: postgres: command not found...