Learning Bash Book menciona que una subshell heredará solo variables de entorno y descriptores de archivos, etc., y que no heredará variables que no se exportan:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Como sé, el shell creará dos subshell para ()
y para ./file
, pero ¿por qué en el ()
caso el subshell identifica la var
variable aunque no se exporta y en el ./file
caso no la identifica?
# 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
Traté de usar strace
para descubrir cómo sucede esto y, sorprendentemente, descubrí que bash usará los mismos argumentos para la llamada al sistema de clonación, por lo que esto significa que tanto el proceso bifurcado ()
como ./file
el mismo deben tener el mismo espacio de dirección del proceso del padre, entonces ¿por qué? en el ()
caso, ¿la variable es visible para la subshell y no ocurre lo mismo para el ./file
caso, aunque los mismos argumentos se basan en la llamada al sistema de clonación?