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.