我试图理解这是什么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
,但-a
被set
命令消耗了
如果我们确实想设置-a
as $1
(和12
as $2
),我们可以使用--
告诉set
命令停止处理选项(即后面的所有内容都是参数)
$ set -- -a 12; echo $1 $2
-a 12