В Learning Bash Book упоминается, что подоболочка будет наследовать только переменные среды, дескрипторы файлов и т. Д. И что она не будет наследовать переменные, которые не экспортируются:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Как я знаю, оболочка создаст две подоболочки для ()
и для ./file
, но почему в этом ()
случае подоболочка идентифицирует 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 будет использовать одни и те же аргументы для системного вызова clone, так что это означает, что как разветвленный процесс, так ()
и ./file
должен иметь одинаковое адресное пространство процесса родителя, так почему в ()
случае, если переменная видима для подоболочки, и то же самое не происходит для ./file
случая, хотя те же аргументы основаны на системном вызове clone?