โดยปกติ$0ในสคริปต์จะตั้งชื่อของสคริปต์หรือสิ่งที่มันถูกเรียกว่า (รวมถึงเส้นทาง) อย่างไรก็ตามถ้าฉันใช้bashกับ-cตัวเลือกให้$0ตั้งค่าเป็นอาร์กิวเมนต์แรกที่ส่งผ่านหลังจากสตริงคำสั่ง:
bash -c 'echo $0 ' foo bar
# foo
ผลดูเหมือนว่าพารามิเตอร์ตำแหน่งได้รับการเลื่อน $0แต่รวมถึง อย่างไรก็ตามshiftในสตริงคำสั่งจะไม่ส่งผลกระทบ$0(ตามปกติ):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
เหตุใดจึงมีพฤติกรรมแปลก ๆ สำหรับสตริงคำสั่ง โปรดทราบว่าฉันกำลังมองหาเหตุผลเหตุผลที่อยู่เบื้องหลังการใช้พฤติกรรมแปลก ๆ
หนึ่งสามารถคาดเดาได้ว่าสตริงคำสั่งดังกล่าวไม่จำเป็นต้องใช้$0พารามิเตอร์ตามปกติที่กำหนดไว้ดังนั้นสำหรับการประหยัดก็ยังใช้สำหรับอาร์กิวเมนต์ปกติ อย่างไรก็ตามในกรณีนั้นพฤติกรรมของshiftคี่ ความเป็นไปได้อีกอย่างหนึ่ง$0คือใช้เพื่อกำหนดพฤติกรรมของโปรแกรม (a la bashเรียกว่าshหรือvimเรียกว่า as vi) แต่ไม่สามารถทำได้เนื่องจาก$0ที่นี่จะเห็นได้เฉพาะในสตริงคำสั่งเท่านั้นและไม่ใช่โดยโปรแกรมที่เรียกว่าภายใน ฉันไม่สามารถคิดถึงการใช้งานอื่น ๆ$0ได้ดังนั้นฉันจึงสูญเสียที่จะอธิบายเรื่องนี้
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *แต่โชคไม่ดีที่$0โดยทั่วไปไม่พารามิเตอร์ที่กำหนดได้ด้วย-sตัวเลือก tream ... มันสามารถนำมาใช้ในหลายรูปแบบเดียวกันxargsโดยทั่วไปแม้ว่า และอื่น ๆ นอกเหนือจาก
--แล้วที่จะมีการตีความปกติของ 'จากที่นี่เริ่มขัดแย้ง' ที่เห็นในโปรแกรมอื่น ๆ จากนั้นอีกครั้งซึ่งอาจสร้างความสับสนให้กับผู้ที่ไม่คุ้นเคยกับ-cการคิดว่า--จริง ๆ แล้วมีการตีความนั้น
-สำหรับอาร์กิวเมนต์เป็นสำนวนเหมือนใน$0sh -c 'foo $1 $2' - a bวิธีนี้ดูปกติดี (เมื่อคุณค้นพบความ-หมายนั่นคือ)