Co robi „set -” w tym punkcie wejścia Dockerfile?

41

Próbuję zrozumieć, co robi ten punkt wejścia Docker .

Wydaje mi się, że jest to bardzo powszechny wzorzec podczas pisania Dockerfiles, ale moje umiejętności bash są ograniczone i nie mam pojęcia o wszystkich specjalnych symbolach bash kung fu.

Poza tym trudno google wpisać „-”, „$!” itp. Jakie są one nazywane w świecie bash?

Podsumowując, co próbuje zrobić poniższy wiersz?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi
Lucas Pottersky
źródło

Odpowiedzi:

55

setPoleceń (gdy nie ustawiania opcji) ustawia parametry pozycyjne np

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

Jest --to standard „nie traktuj niczego po tym jako opcji”

"$@"to wszystkie istniejące parametry pozycji.

Więc sekwencja

set -- haproxy "$@"

Umieści słowo haproxyprzed $1 $2itp.

na przykład

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
źródło
nie widzę żadnej różnicy przy użyciu „-” lub nie. Wypróbowałem tutaj i uzyskałem te same wyniki. Chciałbym, żebyś mógł poprawić odpowiedź, aby podkreślić różnicę.
Lucas Pottersky,
8
Porównaj set -- -z 2 3 4i set -z 2 3 4. --Zatrzymuje -ainterpretowane jako opcja. W tym przypadku nie jest to konieczne , ale „dobrą praktyką” jest przyzwyczajenie się do używania, --gdy masz pewność, co następuje :-)
Stephen Harris
1
Inną główną różnicą jest to, że jeśli pozyskujesz skrypt wewnątrz innego skryptu, użycie set -- $arg1 $arg2pozwoli skryptowi na odczytanie argumentów, w przeciwnym razie tylko Bash obsługuje przekazywanie argumentów bezpośrednio do skryptu źródłowego (i może to być trudne do zauważenia).
dragon788