Il Learning Bash Book menziona che una subshell erediterà solo le variabili di ambiente e i descrittori di file, ecc. E che non erediterà le variabili che non vengono esportate:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Come so la shell creerà due subshell per ()
e per ./file
, ma perché nel ()
caso la subshell identifica la var
variabile anche se non viene esportata e nel ./file
caso in cui non l'ha identificata?
# 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
Ho provato ad utilizzare strace
per capire come questo accade e sorprendentemente ho trovato che bash userà gli stessi argomenti per la chiamata di sistema clone, quindi questo significa che sia il processo biforcuta in ()
e ./file
dovrebbe avere lo stesso spazio di indirizzi del processo del genitore, quindi perché nel ()
caso la variabile sia visibile alla subshell e lo stesso non accade per il ./file
caso, sebbene gli stessi argomenti siano basati sulla chiamata di sistema clone?