Cosa fa "set -" in questo punto di ingresso Dockerfile?


41

Sto cercando di capire cosa fa questo punto di accesso Docker .

Mi sembra che sia un modello molto comune quando scrivo Dockerfile, ma le mie abilità di bash sono limitate e non ho idea di tutti i simboli speciali di bash kung fu.

Inoltre, è difficile cercare su Google "-", "$!" ecc. Come si chiamano questi nel mondo bash?

Riassumendo, cosa sta cercando di fare la linea qui sotto?

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

Risposte:


55

Il setcomando (quando non si impostano le opzioni) imposta i parametri posizionali, ad es

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

Lo --standard è "non trattare nulla seguendo questo come un'opzione"

L' "$@"sono tutti i paramters posizione esistente.

Quindi la sequenza

set -- haproxy "$@"

Metterà la parola haproxydavanti a $1 $2ecc.

per esempio

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c

non vedo alcuna differenza usando "-" o no. Ho provato qui e ho ottenuto gli stessi risultati. Mi piacerebbe se potessi migliorare la risposta per evidenziare la differenza.
Lucas Pottersky,

8
Confronta set -- -z 2 3 4e set -z 2 3 4. L' --arresto -aviene interpretato come un'opzione. In questo caso non è necessario , ma è "buona pratica" prendere l'abitudine di usare --quando si è sicuri di ciò che segue :-)
Stephen Harris,

1
L'altra differenza principale è che se si sta acquistando uno script all'interno di un altro script, l'utilizzo set -- $arg1 $arg2consentirà allo script di origine di leggere gli argomenti, altrimenti solo Bash supporta il passaggio di argomenti direttamente a uno script di origine (e ciò può essere difficile da notare).
dragon788,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.