Bash Subshells และการประมวลผลแบบขนาน

NS เปลือก เป็นอินเทอร์เฟซพื้นฐานสำหรับการป้อนคำสั่งบน a ลินุกซ์ ระบบ. ด้วยวิธีนี้ คุณสามารถป้อนคำสั่งโดยตรงหรือระบุไฟล์ (สคริปต์) ที่มีลำดับของคำสั่งที่จะดำเนินการ เชลล์ถูกจัดระเบียบในลำดับชั้น และเชลล์ใดๆ สามารถสร้างเชลล์ใหม่ได้ เชลล์ใหม่ถือเป็นกระบวนการลูก—a เปลือกย่อย—ของพาเรนต์เชลล์ที่สร้างมันขึ้นมา

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

ลินุกซ์เชลล์ที่แตกต่างกัน

วิธีสร้าง Subshell

ในสคริปต์เชลล์ Bash ให้สร้างเชลล์ย่อยโดยใช้เครื่องหมายวงเล็บ:

#!/bin/bash
# subshell-example.sh พร้อมลูปไม่สิ้นสุด
(
ในขณะที่ [ 1 ]
ทำ
echo "Subshell ทำงาน. ."
เสร็จแล้ว
)

ในตัวอย่าง วง while อยู่ในวงเล็บ ซึ่งทำให้ดำเนินการในเชลล์ย่อยของเชลล์ที่ไฟล์สคริปต์ถูกเรียกใช้งาน

การเรียกใช้ Subshell ในเบื้องหลัง

เว้นแต่ว่าคุณระบุว่าต้องดำเนินการเชลล์ย่อยในพื้นหลัง เชลล์หลักจะรอให้เชลล์ย่อยเสร็จสิ้นก่อนที่จะดำเนินการกับส่วนที่เหลือของสคริปต์ต่อไป อย่างไรก็ตาม ในการรันเชลล์ย่อยแบบขนาน ให้รันเชลล์ย่อยในพื้นหลัง ซึ่งทำได้โดยใช้อักขระเครื่องหมายและตามหลังนิพจน์ subshell ดังที่แสดงที่นี่:

#!/bin/bash 
สำหรับไอพีใน {1..254}; ทำ
เจ้าภาพ=192.168.1.$ip
(ping -c 1 $host > /dev/null
ถ้า [ "$?" = 0]
แล้ว
echo $host
fi) &
เสร็จแล้ว

การเรียกใช้ Subshells หลายรายการในแบบคู่ขนาน

หากคุณสร้างหลาย subshell เป็น กระบวนการเบื้องหลังคุณสามารถรันงานพร้อมกันได้ โดยปกติ ระบบปฏิบัติการจะใช้ตัวประมวลผลหรือแกนประมวลผลที่แตกต่างกันสำหรับแต่ละกระบวนการและกระบวนการย่อย สมมติว่ามีตัวประมวลผลหรือแกนประมวลผลอย่างน้อยเท่ากับจำนวนที่มีกระบวนการ มิฉะนั้น งานจะถูกกำหนดให้กับโปรเซสเซอร์หรือคอร์เดียวกัน ในกรณีนั้น โปรเซสเซอร์หรือคอร์จะสลับระหว่างงานที่ได้รับมอบหมายอย่างต่อเนื่องจนกว่างานจะเสร็จสิ้น

ใช้คำสั่ง wait เพื่อบอกให้กระบวนการหลักรอให้กระบวนการย่อยเสร็จสิ้นก่อนที่จะดำเนินการกับส่วนที่เหลือของสคริปต์:

ใช้สำหรับ Subshells

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

เชลล์ย่อยทำงานกับคำจำกัดความของฟังก์ชัน เรียกใช้งานได้หลายครั้งด้วยพารามิเตอร์ต่างกัน