学习Bash的书提到,一个子shell会只继承环境variabels和文件描述符,...等等,它不会继承变量未出口的击子shell神秘
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
我所知shell会为()case和./file创建两个子shell,但是为什么在()情况下subhell会标识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大小写也不会发生这种情况,尽管相同的参数是基于克隆系统调用的。
你是怎么做strace for()的? – 2016-01-22 01:27:03