“ set -” ทำอะไรในจุดเข้า Dockerfile นี้?


41

ฉันพยายามเข้าใจว่าจุดเข้าใช้งานนักเทียบท่านี้ทำอะไร

ดูเหมือนว่าสำหรับฉันแล้วมันเป็นรูปแบบที่ธรรมดามากเมื่อเขียน Dockerfiles แต่ทักษะการทุบตีของฉันนั้นมี จำกัด

นอกจากนี้มันยากที่ google สำหรับ "-", "$!" ฯลฯ สิ่งเหล่านี้เรียกว่าอะไรในโลกทุบตี?

เพื่อสรุปสิ่งที่บรรทัดร้องพยายามทำคืออะไร?

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

คำตอบ:


55

setคำสั่ง (เมื่อไม่ตั้งค่าตัวเลือก) กำหนดพารามิเตอร์ตำแหน่งเช่น

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

--เป็นมาตรฐาน "ทำอะไรไม่ได้รักษาต่อไปนี้เป็นตัวเลือก"

The "$@"เป็นพารามิเตอร์ตำแหน่งที่มีอยู่ทั้งหมด

ดังนั้นลำดับ

set -- haproxy "$@"

จะใส่คำhaproxyต่อหน้า$1 $2เป็นต้น

เช่น

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

ฉันไม่เห็นความแตกต่างโดยใช้ "-" หรือไม่ พยายามที่นี่และได้ผลลัพธ์เดียวกัน ฉันชอบถ้าคุณสามารถปรับปรุงคำตอบเพื่อเน้นความแตกต่าง
Lucas Pottersky

8
เปรียบเทียบและset -- -z 2 3 4 หยุดถูกตีความว่าเป็นตัวเลือก ในกรณีนี้ก็ไม่จำเป็นแต่มันเป็น "การปฏิบัติที่ดี" ที่จะได้รับเป็นนิสัยของการใช้เมื่อคุณทราบแน่ใจว่าสิ่งที่ต่อไป :-)set -z 2 3 4---a--
สตีเฟ่นแฮร์ริส

1
ความแตกต่างที่สำคัญอื่น ๆ คือถ้าคุณกำลังจัดหาสคริปต์ภายในสคริปต์อื่นการใช้set -- $arg1 $arg2จะอนุญาตให้สคริปต์ที่มาของคุณอ่านอาร์กิวเมนต์มิฉะนั้นเฉพาะ Bash รองรับการส่งผ่านอาร์กิวเมนต์โดยตรงไปยังสคริปต์ที่มา (และอาจเป็นเรื่องยากที่จะสังเกตเห็น)
dragon788
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.