Sách học Bash đề cập rằng một lớp con sẽ chỉ kế thừa các biến môi trường và mô tả tệp, v.v. và nó sẽ không kế thừa các biến không được xuất:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Như tôi biết, shell sẽ tạo hai lớp con cho ()
và cho ./file
, nhưng tại sao trong ()
trường hợp, lớp con lại xác định var
biến mặc dù nó không được xuất và trong ./file
trường hợp nó không xác định được nó?
# 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
Tôi đã cố gắng sử dụng strace
để tìm hiểu làm thế nào điều này xảy ra và thật ngạc nhiên khi tôi thấy rằng bash sẽ sử dụng cùng một đối số cho cuộc gọi hệ thống nhân bản, vì vậy điều này có nghĩa là cả quá trình rẽ nhánh trong ()
và ./file
nên có cùng không gian địa chỉ tiến trình của cha mẹ, vậy tại sao trong ()
trường hợp là biến có thể nhìn thấy đối với lớp con và điều tương tự không xảy ra đối với ./file
trường hợp này, mặc dù các đối số tương tự được dựa trên lệnh gọi hệ thống nhân bản?