Learning Bash Book กล่าวถึงว่า subshell จะสืบทอดเฉพาะตัวแปรสภาพแวดล้อมและ file descriptors ฯลฯ และจะไม่รับสืบทอดตัวแปรที่ไม่ได้ถูกส่งออก:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
ฉันรู้ว่าเชลล์จะสร้างสอง subshell สำหรับ()
และ for ./file
แต่ทำไมใน()
กรณีที่ subshell ระบุvar
ตัวแปรแม้ว่าจะไม่ถูกส่งออกและใน./file
กรณีที่มันไม่ได้ระบุมัน?
# Strace for ()
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617
# Strace for ./file
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631
ฉันพยายามใช้strace
เพื่อหาว่าสิ่งนี้เกิดขึ้นอย่างไรและฉันพบว่า bash จะใช้อาร์กิวเมนต์เดียวกันสำหรับการเรียกระบบโคลนดังนั้นนี่หมายความว่าทั้งกระบวนการแยก()
และ./file
ควรมีพื้นที่ที่อยู่กระบวนการเดียวกันของผู้ปกครองดังนั้นทำไม ใน()
กรณีที่เป็น varible มองเห็นได้กับ subshell และไม่เกิดขึ้นสำหรับ./file
กรณีแม้ว่าข้อโต้แย้งเดียวกันจะขึ้นอยู่กับการเรียกระบบโคลน?