Que fait “set -” dans ce point d’entrée Dockerfile?

41

J'essaie de comprendre ce que fait ce point d' entrée Docker .

Il me semble que c’est un modèle très courant dans Dockerfiles, mais mes compétences en bash sont limitées et je n’ai aucune idée de tous les symboles spéciaux de bash, le kung fu.

En outre, il est difficile de google pour "-", "$!" etc. Comment s'appellent-ils dans le monde bash?

Pour résumer, que tente de faire la ligne ci-dessous?

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

Réponses:

55

La setcommande (lorsque les options ne sont pas définies) définit les paramètres de position, par exemple

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

La --norme est "ne traite rien de ce qui suit comme une option"

Le "$@"sont tous les paramètres de position existants.

Donc la séquence

set -- haproxy "$@"

Va mettre le mot haproxydevant, $1 $2etc.

par exemple

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
la source
Je ne vois aucune différence en utilisant "-" ou pas bien. Essayé ici et obtenu les mêmes résultats. J'adorerais si vous pouviez améliorer la réponse pour mettre en évidence la différence.
Lucas Pottersky
8
Comparez set -- -z 2 3 4et set -z 2 3 4. Les --arrête d' -aêtre interprété comme une option. Dans ce cas, ce n'est pas nécessaire , mais c'est une "bonne pratique" de prendre l'habitude de l'utiliser --quand vous saurez que ce qui suit est vraiment le suivant :-)
Stephen Harris
1
L'autre différence principale est que si vous recherchez un script dans un autre script, l'utilisation set -- $arg1 $arg2permettra à votre script source de lire les arguments, sinon seul Bash prend en charge la transmission directe des arguments à un script source (ce qui peut être délicat à noter).
dragon788