Was macht "set -" in diesem Dockerfile-Eintrittspunkt?

41

Ich versuche zu verstehen, was dieser Docker-Eintrittspunkt tut .

Es scheint mir, dass dies ein sehr verbreitetes Muster beim Schreiben von Dockerdateien ist, aber meine Bash-Fähigkeiten sind begrenzt und ich habe keine Ahnung von all den speziellen Bash-Symbolen Kung Fu.

Außerdem ist es schwierig, in Google nach "-", "$!" Zu suchen. usw. Wie heißen diese in der Bash-Welt?

Zusammenfassend, was versucht die folgende Zeile zu tun?

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

Antworten:

55

Der setBefehl (wenn keine Optionen festgelegt sind) legt die Positionsparameter fest, z

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

Das --ist der Standard "Behandle nichts danach als Option"

Das "$@"sind alle vorhandenen Positionsparameter.

Also die Reihenfolge

set -- haproxy "$@"

Setzt das Wort haproxyvor $1 $2usw.

z.B

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
quelle
Ich sehe keinen Unterschied, wenn ich "-" benutze oder nicht. Versuchte hier und bekam die gleichen Ergebnisse. Ich würde mich freuen, wenn Sie die Antwort verbessern könnten, um den Unterschied hervorzuheben.
Lucas Pottersky
8
Vergleichen set -- -z 2 3 4und set -z 2 3 4. Das --stoppt das -aInterpretieren als Option. In diesem Fall ist es nicht notwendig , aber es ist eine "gute Übung", sich an die Gewohnheit zu gewöhnen, --wenn Sie sich sicher sind, was folgt :-)
Stephen Harris
1
Der andere Hauptunterschied ist, dass, wenn Sie ein Skript in einem anderen Skript verwenden, die Verwendung set -- $arg1 $arg2Ihres Skripts das Lesen der Argumente zulässt. Andernfalls unterstützt nur Bash die direkte Übergabe von Argumenten an ein Skript mit Quellenangabe (und das kann schwierig zu bemerken sein).
Dragon788