O que "set -" faz neste ponto de entrada do Dockerfile?

41

Estou tentando entender o que esse ponto de entrada do Docker faz .

Parece-me que esse é um padrão muito comum ao escrever Dockerfiles, mas minhas habilidades no bash são limitadas e não tenho idéia de todos os símbolos especiais do bash kung fu.

Além disso, é difícil pesquisar no Google por "-", "$!" etc. Como eles são chamados no mundo do bash?

Resumindo, o que a linha abaixo está tentando fazer?

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

Respostas:

55

O setcomando (quando não estiver configurando opções) define os parâmetros posicionais, por exemplo

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

O --é o padrão "não trate nada após isso como uma opção"

O "$@"são todos os paramters posições existentes.

Então a sequência

set -- haproxy "$@"

Colocará a palavra haproxyna frente de $1 $2etc.

por exemplo

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
fonte
Eu não vejo nenhuma diferença usando "-" ou não. Tentei aqui e obtive os mesmos resultados. Eu adoraria que você pudesse melhorar a resposta para destacar a diferença.
Lucas Pottersky
8
Compare set -- -z 2 3 4e set -z 2 3 4. O --pára a -aser interpretado como uma opção. Neste caso não é necessário , mas de "boas práticas" para adquirir o hábito de usar --quando você está nota certeza do que está a seguir :-)
Stephen Harris
11
A outra principal diferença é que, se você estiver fornecendo um script dentro de outro script, usar set -- $arg1 $arg2permitirá que o script de origem leia os argumentos; caso contrário, apenas o Bash suportará a passagem de argumentos diretamente para um script de origem (e isso pode ser difícil de notar).
precisa saber é o seguinte