ข้อแตกต่างเมื่อใช้ backticks ในเครื่องหมายคำพูดคู่และเครื่องหมายคำพูดเดี่ยวใน Bash


12

ทำไมการประมวลผลสองรายการต่อไปนี้จึงแตกต่างกันในเอาต์พุต (ฉันต้องการอัญประกาศคู่สำหรับตัวแปรในคำสั่งในที่สุดของฉัน)

$ sudo su -c "echo `cat /root/root_file`"
cat: /root/root_file: Permission denied
$ sudo su -c 'echo `cat /root/root_file`'
Yay, highly classified content!

คำตอบ:


19

Bash ดำเนินการขยายชุด ก่อนที่คำสั่งจะถูกดำเนินการ ( sudoในกรณีนี้) ในกรณีแรกการทดแทนคำสั่งจะดำเนินการเพราะอยู่ในเครื่องหมายคำพูดคู่ - มันดำเนินการตามที่คุณดังนั้นข้อผิดพลาด ในกรณีที่สองอัญประกาศเดียวจะป้องกันการขยายดังนั้น backticks จะไม่ถูกแทนที่จนกว่าเชลล์ของรูทจะทำงาน

ดูเพิ่มเติมที่https://www.gnu.org/software/bash/manual/bashref.html#Quoting


6

ในตัวอย่างแรก backticks จะถูกประเมินโดยเชลล์ของคุณ (ในขณะที่คุณและไม่ได้รูท) ลองด้วย

sudo su -c "echo `whoami`"

ในอันที่สองที่มีเครื่องหมายคำพูดเดี่ยว'สตริงทั้งหมดecho `cat /root/root_file`จะถูกส่งผ่านไปยังรูทเชลล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.