在这个 Dockerfile 入口点中,“set --”有什么作用?

Luc*_*sky 68 shell-script set

我试图了解这个Docker 入口点的作用

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

此外,很难用谷歌搜索“--”、“$!” 等等。这些在 bash 世界中被称为什么?

总而言之,下面的行试图做什么?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi
Run Code Online (Sandbox Code Playgroud)

Ste*_*ris 97

set命令(当不设置选项)设置位置参数例如

$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c
Run Code Online (Sandbox Code Playgroud)

--是标准的“做以下这作为一个选项不把任何东西”

"$@"是所有现有的位置paramters。

所以序列

set -- haproxy "$@"
Run Code Online (Sandbox Code Playgroud)

将这个词haproxy放在$1 $2etc前面。

例如

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Run Code Online (Sandbox Code Playgroud)

  • 比较 `set -- -z 2 3 4` 和 `set -z 2 3 4`。`--` 停止将 `-a` 解释为选项。在这种情况下,这不是 _necessary_,但是当您确定以下内容时,养成使用 `--` 的习惯是“好习惯”:-) (16认同)
  • 另一个主要区别是,如果您在另一个脚本中获取脚本,则使用 `set -- $arg1 $arg2` 将允许您的源脚本读取参数,否则只有 Bash 支持将参数直接传递给源脚本(和这可能很难注意到)。 (3认同)
  • @StephenHarris,我认为应该是“`--` 停止将`-z` 解释为选项”,对吗? (3认同)