นิยามฟังก์ชันเชลล์: ทำไมมีช่องว่างหลังวงเล็บเปิด?


คำตอบ:


13

{}

          { list; }

การวางรายการคำสั่งระหว่างวงเล็บปีกกาทำให้รายการถูกเรียกใช้งานในบริบทเชลล์ปัจจุบัน ไม่มีการสร้างเชลล์ย่อย จำเป็นต้องใช้รายการอัฒภาค (หรือขึ้นบรรทัดใหม่)

นอกเหนือจากการสร้างเชลล์ย่อยแล้วยังมีความแตกต่างเล็กน้อยระหว่างโครงสร้างทั้งสองนี้เนื่องจากเหตุผลทางประวัติศาสตร์ วงเล็บปีกกาเป็นคำที่สงวนไว้ดังนั้นพวกเขาจะต้องแยกออกจากรายการโดยช่องว่างหรือตัวอักษรเชลล์อื่น ๆ วงเล็บคือโอเปอเรเตอร์และจะรับรู้เป็นโทเค็นแยกโดยเชลล์แม้ว่าจะไม่ได้แยกออกจากรายการด้วยช่องว่าง

// แหล่งที่มา


1
ฉันตอบด้วยคำตอบของคุณในโพสต์ของตัวเองในหน้านี้ มันเป็นฟังก์ชั่นไม่ใช่การจัดกลุ่มคำสั่ง
donothingsuccessfully

3
@donothingsuccessfully ร่างกายของฟังก์ชั่นคือการจัดกลุ่มคำสั่ง
Gilles 'หยุดความชั่วร้าย'

3

ฉันคิดว่า @rush อาจให้คำตอบที่ถูกต้องหากเข้าใจผิดที่นี่ fork-bomb กำหนดฟังก์ชั่นที่เรียกว่า " :" รหัสในเครื่องหมายปีกกาจะไม่ถูกเรียกใช้งานจนกว่าจะมีการเรียกใช้ฟังก์ชันโดยสุดท้าย " :" ดังนั้นวงเล็บปีกกาเป็นกลุ่มคำสั่งและวงเล็บปีกกาเป็นร่างกายฟังก์ชั่น syntactically เหมือนกัน แต่มีความหมายที่แตกต่างกัน
จากเอกสารเดียวกันกับ @rush cites:

โปรดทราบว่าด้วยเหตุผลทางประวัติศาสตร์ในการใช้งานทั่วไปวงเล็บปีกกาที่ล้อมรอบร่างกายของฟังก์ชั่นจะต้องแยกออกจากร่างกายโดยช่องว่างหรือขึ้นบรรทัดใหม่ นี่เป็นเพราะวงเล็บปีกกาเป็นคำที่สงวนไว้และจะรับรู้ได้เฉพาะเมื่อพวกเขาถูกแยกออกจากรายการคำสั่งโดยช่องว่างหรือ metacharacter เชลล์อื่น นอกจากนี้เมื่อใช้วงเล็บปีกการายการจะต้องสิ้นสุดด้วยเครื่องหมายอัฒภาค, '&' หรือขึ้นบรรทัดใหม่


3
ไม่คำตอบของรัชนั้นถูกต้อง วงเล็บปีกการอบ ๆ ร่างกายของฟังก์ชั่นเป็นองค์ประกอบทางวากยสัมพันธ์เช่นเดียวกับเมื่อพวกเขาไม่ได้แยกตัวของฟังก์ชั่น ดูกฎไวยากรณ์เชลล์ : a function_bodyคือcompound_command(บวกกับตัวเลือกredirect_list) ต้องการพื้นที่เนื่องจาก{เป็นคำสงวนไม่ใช่อักขระพิเศษ
Gilles 'หยุดความชั่วร้าย'

ใช่คำตอบของรัชนั้นถูกต้องตามที่ฉันพูด ใช่พวกเขาเป็น syntactically เหมือนที่ฉันพูด แต่brace_groupมีพฤติกรรมแตกต่างกันเมื่อส่วนหนึ่งของฟังก์ชั่นและเมื่อไม่ได้ ฉันใช้การจัดกลุ่มคำสั่งเพื่ออธิบายกรณีหลังและนี่คือสิ่งที่อธิบายไว้ในลิงค์ของรัช
donothingsuccessfully

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