Что «set -» делает в этой точке входа Dockerfile?

41

Я пытаюсь понять, что делает эта точка входа в Docker .

Мне кажется, что при написании Dockerfiles это очень распространенный паттерн, но мои навыки работы с bash ограничены, и я понятия не имею о всех специальных символах bash kung fu.

Кроме того, трудно гуглить по "-", "$!" и т.д. Как они называются в мире Bash?

Подводя итог, что пытается сделать линия ниже?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi
Лукас Поттерский
источник

Ответы:

55

Команда set(если не заданы параметры) устанавливает позиционные параметры, например

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

Это --стандарт "не рассматривайте что-либо после этого как вариант"

"$@"Все существующие позиции paramters.

Итак, последовательность

set -- haproxy "$@"

Поставит слово haproxyперед $1 $2и т. Д.

например

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Стивен Харрис
источник
Я не вижу никакой разницы, используя «-» или нет, хотя. Попробовал здесь и получил те же результаты. Я хотел бы, чтобы вы могли улучшить ответ, чтобы подчеркнуть разницу.
Лукас Поттерский
8
Сравните set -- -z 2 3 4и set -z 2 3 4. --Останавливает -aинтерпретируется в качестве опции. В этом случае в этом нет необходимости , но это «хорошая практика», чтобы привыкнуть использовать, --когда вы точно знаете, что следует :-)
Стивен Харрис
1
Другое основное отличие состоит в том, что если вы создаете сценарий внутри другого сценария, использование set -- $arg1 $arg2позволит вашему исходному сценарию считывать аргументы, в противном случае только Bash поддерживает передачу аргументов непосредственно в исходный сценарий (и это может быть сложно заметить).
dragon788