學習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