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กรณีแม้ว่าข้อโต้แย้งเดียวกันจะขึ้นอยู่กับการเรียกระบบโคลน?