คุณอาจจะรู้ว่าระเบิดส้อม :
:(){ :|:&};: #WARNING: harmful code
ฉันสงสัยว่าทำไมมันเป็นสิ่งจำเป็นเพื่อให้การแยกเพื่อรวมช่องว่างหลังจากวงเล็บปีกกาเปิด
คุณอาจจะรู้ว่าระเบิดส้อม :
:(){ :|:&};: #WARNING: harmful code
ฉันสงสัยว่าทำไมมันเป็นสิ่งจำเป็นเพื่อให้การแยกเพื่อรวมช่องว่างหลังจากวงเล็บปีกกาเปิด
คำตอบ:
{}
{ list; }
การวางรายการคำสั่งระหว่างวงเล็บปีกกาทำให้รายการถูกเรียกใช้งานในบริบทเชลล์ปัจจุบัน ไม่มีการสร้างเชลล์ย่อย จำเป็นต้องใช้รายการอัฒภาค (หรือขึ้นบรรทัดใหม่)
นอกเหนือจากการสร้างเชลล์ย่อยแล้วยังมีความแตกต่างเล็กน้อยระหว่างโครงสร้างทั้งสองนี้เนื่องจากเหตุผลทางประวัติศาสตร์ วงเล็บปีกกาเป็นคำที่สงวนไว้ดังนั้นพวกเขาจะต้องแยกออกจากรายการโดยช่องว่างหรือตัวอักษรเชลล์อื่น ๆ วงเล็บคือโอเปอเรเตอร์และจะรับรู้เป็นโทเค็นแยกโดยเชลล์แม้ว่าจะไม่ได้แยกออกจากรายการด้วยช่องว่าง
// แหล่งที่มา
ฉันคิดว่า @rush อาจให้คำตอบที่ถูกต้องหากเข้าใจผิดที่นี่ fork-bomb กำหนดฟังก์ชั่นที่เรียกว่า " :
" รหัสในเครื่องหมายปีกกาจะไม่ถูกเรียกใช้งานจนกว่าจะมีการเรียกใช้ฟังก์ชันโดยสุดท้าย " :
" ดังนั้นวงเล็บปีกกาเป็นกลุ่มคำสั่งและวงเล็บปีกกาเป็นร่างกายฟังก์ชั่น syntactically เหมือนกัน แต่มีความหมายที่แตกต่างกัน
จากเอกสารเดียวกันกับ @rush cites:
โปรดทราบว่าด้วยเหตุผลทางประวัติศาสตร์ในการใช้งานทั่วไปวงเล็บปีกกาที่ล้อมรอบร่างกายของฟังก์ชั่นจะต้องแยกออกจากร่างกายโดยช่องว่างหรือขึ้นบรรทัดใหม่ นี่เป็นเพราะวงเล็บปีกกาเป็นคำที่สงวนไว้และจะรับรู้ได้เฉพาะเมื่อพวกเขาถูกแยกออกจากรายการคำสั่งโดยช่องว่างหรือ metacharacter เชลล์อื่น นอกจากนี้เมื่อใช้วงเล็บปีกการายการจะต้องสิ้นสุดด้วยเครื่องหมายอัฒภาค, '&' หรือขึ้นบรรทัดใหม่
function_body
คือcompound_command
(บวกกับตัวเลือกredirect_list
) ต้องการพื้นที่เนื่องจาก{
เป็นคำสงวนไม่ใช่อักขระพิเศษ
brace_group
มีพฤติกรรมแตกต่างกันเมื่อส่วนหนึ่งของฟังก์ชั่นและเมื่อไม่ได้ ฉันใช้การจัดกลุ่มคำสั่งเพื่ออธิบายกรณีหลังและนี่คือสิ่งที่อธิบายไว้ในลิงค์ของรัช
{
ไม่ได้เป็นโอเปอเรเตอร์ แต่เป็นคำที่สงวนไว้และคำต้องแยกออกจากคำอื่นเพื่อที่จะได้พิจารณาอย่างชัดเจน