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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.