《学习狂书》提到子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
情况下基于克隆系统调用,则不会发生这种情况?