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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.