“set --” 在此 Dockerfile 入口点中做什么?

“set --” 在此 Dockerfile 入口点中做什么?

我试图理解这是什么Docker 入口点确实

在我看来,这是编写 Dockerfile 时非常常见的模式,但我的 bash 技能有限,我不知道所有特殊的 bash 符号功夫。

此外,很难在谷歌上搜索“--”、“$!”等等。这些在 bash 世界里叫什么?

总而言之,下面这行代码想要做什么?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi

答案1

set命令(未设置选项时)设置位置参数,例如

$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c

--是标准“不要将其后的任何内容视为选项”

这些"$@"是所有现有的位置参数。

所以顺序

set -- haproxy "$@"

会把这个词放在etchaproxy前面。$1 $2

例如

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c

答案2

设置命令支持选项(包括标志)和参数

set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [argument …]
  • options可用于更改命令的工作方式(即它如何解释文件名)
  • arguments告诉命令要做什么:即您的用户输入

例如 set 命令有一个选项

-a:创建或修改的每个变量或函数都被赋予导出属性,并标记为导出到后续命令的环境。

当我们执行:

$ set -a 12; echo $1
12

您可以看到它$1被设置为12,但-aset命令消耗了

如果我们确实想设置-aas $1(和12as $2),我们可以使用--告诉set命令停止处理选项(即后面的所有内容都是参数)

$ set -- -a 12; echo $1 $2
-a 12

相关内容