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 varvariabile anche se non viene esportata e nel ./filecaso 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 straceper 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 ./filedovrebbe 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 ./filecaso, sebbene gli stessi argomenti siano basati sulla chiamata di sistema clone?