การใช้ parens ทำให้คำสั่งในเชลล์ย่อยซึ่งไม่ใช่สิ่งที่คุณต้องการ หรือใช้วงเล็บปีกกา:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
เคล็ดลับที่นี่คือว่าไม่เหมือน parens ;
คำสั่งสุดท้ายในการจัดฟันจะต้องตามด้วย
เหตุใดจึงต้องใช้เครื่องหมายอัฒภาคหรือขึ้นบรรทัดใหม่
วงเล็บปีกกาเป็นอาร์กิวเมนต์ที่ถูกต้องสำหรับคำสั่ง ตัวอย่างเช่นนี่คือเครื่องหมายปีกกาแบบหยิกเป็นอาร์กิวเมนต์เพื่อecho
:
$ echo }
}
ดังนั้นถ้าเชลล์เห็น:
{ command1; command2 }
ตีความเปลือก Command1 ว่ามีการขัดแย้งใดและ Command2 }
ว่ามีหนึ่งอาร์กิวเมนต์ประกอบด้วยตัวอักษร วงเล็บปีกกา}
จะถูกตีความว่าเป็นการปิดการจัดกลุ่มเท่านั้นหากเป็นไปตามเซมิโคลอนหรือขึ้นบรรทัดใหม่ หากต้องการทำงานด้านบน:
{ command1; command2; }
Subshells และความแตกต่างระหว่าง{...}
และ(...)
สังเกตว่าค่าต่อไปนี้ตั้งค่าx
เป็น 10 แต่การตั้งค่านั้นถูกลืมก่อนที่echo
คำสั่งจะทำงาน:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
ด้วยการจัดฟันแบบเส้นตรงในทางตรงกันข้ามการตั้งค่าของx=10
จะถูกจดจำ:
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
ความแตกต่างเป็นเพราะการกำหนดตัวแปรใน subshell ไม่รอดหลังจากที่ subshell เสร็จสมบูรณ์
เอกสาร
จากman bash
:
(รายการ)
รายการจะถูกดำเนินการในสภาพแวดล้อม subshell (ดูคำสั่งการดำเนินการด้านสิ่งแวดล้อมด้านล่าง) การกำหนดตัวแปรและคำสั่ง builtin ที่ส่งผลกระทบต่อสภาพแวดล้อมของเชลล์จะไม่มีผลบังคับใช้หลังจากคำสั่งเสร็จสิ้น สถานะการส่งคืนคือสถานะการออกของรายการ
{รายการ; }
รายการจะถูกดำเนินการอย่างง่ายในสภาพแวดล้อมเชลล์ปัจจุบัน รายการจะต้องถูกยกเลิกด้วยการขึ้นบรรทัดใหม่หรืออัฒภาค สิ่งนี้เรียกว่าคำสั่งกลุ่ม สถานะการส่งคืนคือสถานะการออกของรายการ โปรดทราบว่าแตกต่างจาก metacharacters (และ), {และ} เป็นคำสงวนและจะต้องเกิดขึ้นเมื่อคำที่สงวนไว้ได้รับอนุญาตให้รับรู้ เนื่องจากไม่ทำให้เกิดการแบ่งคำจึงต้องแยกออกจากรายการด้วยช่องว่างหรือเชลล์ตัวอักขระอื่น
[เน้นเพิ่ม]
()
{}