Apa yang dilakukan “set -” di titik masuk Dockerfile ini?

41

Saya mencoba memahami apa yang dilakukan titik masuk Docker ini .

Menurut saya itu adalah pola yang sangat umum ketika menulis Dockerfiles, tetapi keterampilan bash saya terbatas dan saya tidak tahu semua simbol bash kung fu.

Juga, sulit untuk google untuk "-", "$!" dll. Apa ini disebut di dunia bash?

Ringkasnya, apa yang ingin dilakukan garis di bawah ini?

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

Jawaban:

55

The setperintah (jika tidak menetapkan pilihan) menetapkan posisi parameter misalnya

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

Ini --adalah standar "jangan memperlakukan apa pun yang mengikuti ini sebagai opsi"

Semua "$@"parameter posisi yang ada.

Jadi urutannya

set -- haproxy "$@"

Akan meletakkan kata haproxydi depan $1 $2dll.

misalnya

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c
Stephen Harris
sumber
saya tidak melihat perbedaan menggunakan "-" atau tidak. Mencoba di sini dan mendapat hasil yang sama. Saya akan senang jika Anda dapat meningkatkan jawaban untuk menyoroti perbedaannya.
Lucas Pottersky
8
Bandingkan set -- -z 2 3 4dan set -z 2 3 4. The --menghentikan -amakhluk ditafsirkan sebagai pilihan. Dalam hal ini tidak perlu , tapi itu adalah "praktik yang baik" untuk membiasakan diri menggunakan --ketika Anda perhatikan apa yang terjadi selanjutnya :-)
Stephen Harris
1
Perbedaan utama lainnya adalah bahwa jika Anda mencari skrip di dalam skrip lain, menggunakan set -- $arg1 $arg2akan memungkinkan skrip bersumber Anda untuk membaca argumen, jika tidak hanya Bash yang mendukung meneruskan argumen langsung ke skrip bersumber (dan itu bisa sulit untuk diketahui).
dragon788