W Learning Bash Book wspomniano, że podpowłoka odziedziczy tylko zmienne środowiskowe i deskryptory plików itp. Oraz że nie odziedziczy zmiennych, które nie są eksportowane:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Jak wiem, powłoka utworzy dwie podpowłoki dla ()
i dla ./file
, ale dlaczego w takim ()
przypadku podpowłoka identyfikuje var
zmienną, chociaż nie jest eksportowana, aw ./file
przypadku, gdy jej nie identyfikuje?
# 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
Próbowałem użyć, strace
aby dowiedzieć się, jak to się dzieje i, co zaskakujące, odkryłem, że bash użyje tych samych argumentów dla wywołania systemowego klonowania, więc oznacza to, że zarówno rozwidlony proces w, jak ()
i ./file
powinien mieć tę samą przestrzeń adresową procesu nadrzędnego, więc dlaczego w ()
przypadku jest varible widoczne podpowłoce i tym samym nie stanie na ./file
razie, chociaż te same argumenty są oparte na funkcji systemowej clone?