为什么变量在子Shell中可见?
《学习狂书》提到子shell将仅继承环境变量和文件描述符等,并且不会继承未导出的变量: $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ 据我所知,shell将为for ()和for 创建两个子shell ./file,但是为什么在()子shell中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将对克隆系统调用使用相同的参数,因此这意味着分叉的进程()和./file应该具有与父进程相同的进程地址空间,所以为什么在这种()情况下,子外壳可见该变量,而在相同./file情况下基于克隆系统调用,则不会发生这种情况?