คุณกำลังตีความหน้าคนผิด ประการแรกส่วนเกี่ยวกับ--การส่งสัญญาณตัวเลือกสุดท้ายนั้นไม่เกี่ยวข้องกับสิ่งที่คุณพยายามทำ -cแทนที่ส่วนที่เหลือของบรรทัดคำสั่งจากจุดนั้นเพื่อที่จะไม่ไปผ่านการจัดการตัวเลือกทุบตีที่ทั้งหมดหมายความว่า--จะถูกส่งผ่านไปยังคำสั่งที่ไม่ได้รับการจัดการโดยทุบตีเป็นจุดสิ้นสุดของเครื่องหมายตัวเลือก
ข้อผิดพลาดที่สองคือข้อโต้แย้งพิเศษที่ได้รับมอบหมายเป็นพารามิเตอร์ตำแหน่งให้กับกระบวนการเชลล์ที่เปิดตัวไม่ผ่านเป็นข้อโต้แย้งไปยังคำสั่ง ดังนั้นสิ่งที่คุณพยายามทำอาจเป็นหนึ่งใน:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
ในกรณีแรกผ่าน echo พารามิเตอร์$0และ$1อย่างชัดเจนและในกรณีที่สองใช้"$@"เพื่อขยายตามปกติเป็น "พารามิเตอร์ตำแหน่งทั้งหมดยกเว้น $ 0" โปรดทราบว่าในกรณีนี้เราต้องส่งบางสิ่งบางอย่างเพื่อใช้เป็น$0เช่นกัน ฉันเลือก "ทุบตี" เพราะนั่นคือสิ่งที่$0ปกติจะได้ แต่สิ่งอื่นจะทำงาน
สำหรับเหตุผลที่ทำเช่นนี้แทนที่จะส่งผ่านอาร์กิวเมนต์ใด ๆ ที่คุณให้กับคำสั่งที่คุณระบุรายการโดยตรง: โปรดสังเกตว่าเอกสารอธิบายว่า "คำสั่งsอ่านจากสตริง" พหูพจน์ กล่าวอีกนัยหนึ่งโครงการนี้ให้คุณทำ:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
แต่โปรดทราบว่าวิธีที่ดีกว่าในการบรรลุเป้าหมายดั้งเดิมของคุณอาจใช้envแทนbash:
/usr/bin/env -- "ls" "-l"
หากคุณไม่ต้องการคุณสมบัติใด ๆ ที่เชลล์มอบให้ไม่มีเหตุผลที่จะใช้งาน - การใช้envในกรณีนี้จะเร็วขึ้นง่ายขึ้นและพิมพ์น้อยลง และคุณไม่ต้องคิดอย่างหนักเพื่อให้แน่ใจว่ามันจะจัดการกับชื่อไฟล์ที่มีเชลล์เมตาอักขระหรือช่องว่างอย่างปลอดภัย