¿Qué hace "set -" en este punto de entrada de Dockerfile?

41

Estoy tratando de entender lo que hace este punto de entrada de Docker .

Me parece que es un patrón muy común cuando escribo Dockerfiles, pero mis habilidades de bash son limitadas y no tengo idea de todos los símbolos especiales de bash kung fu.

Además, es difícil buscar en Google "-", "$!" ¿Cómo se llaman estos en bash world?

Para resumir, ¿cuál es la línea que sigue tratando de hacer?

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

Respuestas:

55

El setcomando (cuando no está configurando opciones) establece los parámetros posicionales, por ejemplo

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

El --es el estándar "no trate nada después de esto como una opción"

El "$@"son todos los parametros de posición existentes.

Entonces la secuencia

set -- haproxy "$@"

Pondrá la palabra haproxydelante de $1 $2etc.

p.ej

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
fuente
No veo ninguna diferencia usando "-" o no. Intenté aquí y obtuve los mismos resultados. Me encantaría que pudieras mejorar la respuesta para resaltar la diferencia.
Lucas Pottersky
8
Compara set -- -z 2 3 4y set -z 2 3 4. El --deja de -aser interpretado como una opción. En este caso no es necesario , pero es una "buena práctica" adquirir el hábito de usar --cuando esté seguro de lo que sigue :-)
Stephen Harris
1
La otra diferencia principal es que si set -- $arg1 $arg2obtiene un script dentro de otro script, el uso permitirá que su script de origen lea los argumentos, de lo contrario, solo Bash admite pasar argumentos directamente a un script de origen (y eso puede ser difícil de notar).
dragon788