วงเล็บถูกตีความที่บรรทัดคำสั่งอย่างไร


45

ในขณะที่อ่านวิธีการตั้งค่าgrubฉันเจอบทความที่อ้างว่าฉันต้องใช้หนึ่งในสองไวยากรณ์ต่อไปนี้

echo \(hd0,0\) >> /boot/grub/grub.conf

หรือ

echo '(hd0,0)' >> /boot/grub/grub.conf

เพราะที่บรรทัดคำสั่งวงเล็บจะถูกตีความในลักษณะพิเศษ มีอะไรพิเศษเกี่ยวกับวงเล็บ? พวกเขาตีความอย่างไร

คำตอบ:


46

วงเล็บแสดงถึง subshell ใน bash ในการอ้างถึงman bashหน้า:

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

โดยที่ a listเป็นเพียงลำดับของคำสั่งปกติ

นี้เป็นจริงค่อนข้างแบบพกพาและไม่เฉพาะเพียงbashแต่ ข้อมูลจำเพาะ POSIX เชลล์ภาษาคำสั่งที่มีรายละเอียดต่อไปนี้สำหรับ(compound-list)ไวยากรณ์:

ดำเนินการรายการผสมในสภาพแวดล้อมย่อย ดูเชลล์ประมวลสภาพแวดล้อม การกำหนดตัวแปรและคำสั่งในตัวที่มีผลต่อสภาพแวดล้อมจะไม่คงอยู่หลังจากรายการเสร็จสิ้น


ใน bash และ shells อื่น ๆ ... ?
jasonwryan

3
ทุบตีเป็นหนึ่งฉันถูกถามเกี่ยวกับ ...
สตีฟบราวน์

5
ความแตกต่างระหว่าง$()และ()คืออะไร
CMCDragonkai

5
@CMCDragonkai การ$()แทนคำสั่ง is, ()คือ subshell ทั้งคู่เรียกใช้คำสั่งความแตกต่างคือสิ่งที่เกิดขึ้นกับเอาท์พุท ชื่อนั้นง่ายต่อการค้นหามากกว่าสัญลักษณ์ ดูเพิ่มเติมที่unix.stackexchange.com/q/213530/9537
jw013

12

รายการคำสั่งที่ฝังอยู่ในวงเล็บจะทำงานเป็น subshell

ตัวแปรใน subshell ไม่สามารถมองเห็นได้นอก block of code ใน subshell พวกเขาไม่สามารถเข้าถึงกระบวนการผู้ปกครองไปยังเปลือกที่เปิดตัว subshell เหล่านี้คือตัวแปรโลคอล

ดูLinuxtopia - บทที่ 20 Subshells

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