Learning Bash Book menyebutkan bahwa subkulit hanya akan mewarisi variabel lingkungan dan deskriptor file, dll., Dan itu tidak akan mewarisi variabel yang tidak diekspor:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
Seperti yang saya tahu shell akan membuat dua subkulit untuk ()
dan untuk ./file
, tetapi mengapa dalam ()
kasus ini subkulit mengidentifikasi var
variabel meskipun tidak diekspor dan dalam ./file
kasus itu tidak mengidentifikasi itu?
# 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
Saya mencoba menggunakan strace
untuk mencari tahu bagaimana ini terjadi dan mengejutkan saya menemukan bahwa bash akan menggunakan argumen yang sama untuk panggilan sistem klon, jadi ini berarti bahwa kedua proses bercabang di ()
dan ./file
harus memiliki ruang alamat proses proses yang sama dari induk, jadi mengapa dalam ()
kasus ini apakah variabel terlihat oleh subkulit dan hal yang sama tidak terjadi untuk ./file
kasus, meskipun argumen yang sama didasarkan pada panggilan sistem klon?