sub-shell เป็นสิ่งเดียวกันกับ child-shell


11

: มีสองชื่อsubshellและเด็กเปลือก

ใช่กระบวนการลูกจะเริ่มจากสิ่งนี้:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

ทุกคนมีความเสมอภาคและใช้ชื่อเดียวกันหรือไม่? ทุกคนแบ่งปันคุณสมบัติเดียวกันหรือไม่


POSIX มีคำจำกัดความนี้ :

สภาวะแวดล้อมการประมวลผลเชลล์ประกอบด้วย ....

แต่ลิงค์สุดท้ายของย่อหน้าด้านบนมี:

สภาพแวดล้อม subshell จะต้องสร้างขึ้นซ้ำกับสภาพแวดล้อมของเชลล์ยกเว้นกับดักสัญญาณที่ไม่ได้ถูกละเว้นจะถูกตั้งค่าเป็นการกระทำเริ่มต้น

และพิเศษ:

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

sh -c 'echo "Hello"'ไม่ได้รวมอยู่ที่นั่นควรที่จะเรียกว่า subshell ยัง?

คำตอบ:


14

เชลล์ย่อยทำซ้ำเชลล์ที่มีอยู่ มันมีตัวแปรที่เหมือนกันfork¹ , ฟังก์ชั่นเดียวกัน, ตัวเลือกเดียวกัน, ฯลฯ ภายใต้ประทุน, มีการสร้างเชลล์ย่อยด้วยการเรียกระบบ²; กระบวนการเด็กจะทำสิ่งที่คาดหวังในขณะที่ผู้ปกครองรอ (เช่น$(…)) หรือดำเนินชีวิต (เช่น… &) หรือทำสิ่งที่คาดหวัง (เช่น… | …)

sh -c …ไม่สร้าง subshell มันเปิดตัวโปรแกรมอื่น โปรแกรมนั้นเป็นเชลล์ แต่มันเป็นเรื่องบังเอิญ โปรแกรมอาจเป็นเชลล์ที่แตกต่างกัน (เช่นหากคุณรันsh -c …จาก bash และshdash) เช่นโปรแกรมที่แตกต่างอย่างสิ้นเชิงที่เพิ่งเกิดขึ้นมีความคล้ายคลึงกันอย่างมากในพฤติกรรมของมัน ภายใต้ประทุนการเรียกใช้คำสั่งภายนอก ( shหรืออื่น ๆ ) เรียกการเรียกของforkระบบจากนั้นการexecveเรียกของระบบเพื่อแทนที่โปรแกรมเชลล์ในกระบวนการย่อยด้วยโปรแกรมอื่น (ที่นี่sh)

¹ รวมถึง$$แต่ไม่รวมตัวแปรบางเปลือกที่เฉพาะเจาะจงเช่นทุบตีและของ BASHPIDmksh
² อย่างน้อยนั่นคือการดำเนินการตามปกติและปกติ เชลล์สามารถปรับส้อมให้เหมาะสมหากพวกเขาเลียนแบบพฤติกรรมได้

หน้าเว็บที่เกี่ยวข้องมนุษย์ส้อม (2) , execve (2)


ขอบคุณ การใช้สคริปต์ทุบตีกับ bash shebang เป็นของอะไร
ทิม

@Tim เหมือนกับsh -c: นั่นคือ subprocess ที่บังเอิญเกิดขึ้นเป็นเชลล์
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

(1) "เรียกใช้คำสั่งภายนอก (sh หรืออื่น ๆ ) เรียกการเรียกระบบ fork แล้วเรียกใช้ระบบ execve เพื่อแทนที่เชลล์โปรแกรมในกระบวนการย่อยโดยโปรแกรมอื่น (ที่นี่ sh)" ถูกต้องหรือไม่ที่ fork สร้าง subshell ขึ้นมาก่อนจากนั้น execve จะแทนที่ subshell ด้วยโปรแกรมภายนอก? ดังนั้นในสองกรณีในการตอบกลับของคุณจะมีการสร้างเชลล์ย่อยเสมอหรือไม่ (2) "เชลล์ย่อยที่ทำซ้ำเชลล์ที่มีอยู่" นั่นหมายความว่าอย่างไร?
ทิม

(3) ในbash -c <command>หลังจากแยกเชลล์แล้วดำเนินbash -c <command>การเชลล์ bash จะถูกสร้างขึ้น จากนั้นการเรียกของระบบจะใช้เพื่อเรียก<command>ส้อม bash เชลล์อีกครั้งและประมวลผล<command>หรือไม่
ทิม

2
@cuonglm“ Child shell” ไม่ใช่คำศัพท์ทางเทคนิคที่มีความหมายเฉพาะซึ่งแตกต่างจาก“ subshell” ถ้ามันเป็นเปลือกที่เป็นลูกมันก็จะเป็นเปลือกลูกทำตามกฎทั่วไปของอังกฤษ
Gilles 'หยุดความชั่วร้าย' ใน

1

สภาพแวดล้อม sub-shell ไม่จำเป็นต้องอาศัยอยู่ในกระบวนการแยกต่างหากมันเพียงแค่ต้องการทำซ้ำสภาพแวดล้อมการดำเนินการปัจจุบัน ในksh93นี้จะทำโดยกลไกที่ไม่ได้โทรvirtual sub-shell fork()สิ่งนี้ทำให้ ksh93 เร็วมากบนแพลตฟอร์มแบบเก่าเช่นWin-DOSเดียวWin-DOSกับการฟอร์กที่ช้ามาก

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

แม้ในขณะที่เปลือกหอยและปัจจุบันของคุณเหมือนกันนี้ไม่ซ้ำกันสภาพแวดล้อมการดำเนินการจึงไม่ได้สร้างshsub-shell


ดังนั้นในเชลล์อื่น ๆ ยกเว้นksh93subshell เป็น child shell ใช่ไหม?
cuonglm

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