《学习Bash书籍》提到,子shell只会继承环境变量和文件描述符等内容,但不会继承未被导出的变量等内容。
据我所知,对于()情况和./file情况,shell会创建两个子shell,但为什么在()情况下子shell可以识别var变量,尽管它没有被导出,在./file情况下却无法识别呢?
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
据我所知,对于()情况和./file情况,shell会创建两个子shell,但为什么在()情况下子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应该具有相同的父进程地址空间,那么为什么在()情况下变量对子shell可见,而对于./file情况却不会发生,尽管基于克隆系统调用的参数相同?