關(guān)于"子"shell與子shell

在第二周課程中,老師說到使用小括號(list)可以調(diào)出子shell漱逸,并舉了以下例子:



這個例子很好理解:在當(dāng)前shell,變量name被賦值為wang;而在通過()進(jìn)入的子shell里专缠,變量name被賦值為zhang狰挡。所以第一個echo顯示當(dāng)前shell內(nèi)變量name的值為wang捂龄;第二個echo顯示子shell內(nèi)變量name的值為zhang;第三個echo是子shell結(jié)束后加叁,回到當(dāng)前shell倦沧,變量name的值為wang.
緊接著,老師又寫了一行命令它匕,讓大家判斷它的輸出值會是什么:



根據(jù)之前的經(jīng)驗展融,name作為當(dāng)前shell的一個普通變量,并沒有被export豫柬,子shell是不會繼承的告希,輸出值自然是“wang 空值 wang”咯。然后結(jié)果卻出乎意料:

怎么回事烧给,在沒有export的情況下燕偶,子shell怎么繼承了父shell的環(huán)境變量?
課后特意去詢問老師础嫡,老師大致解釋說指么,用()打開的子shell與執(zhí)行bash打開的子shell還是不同的,它沒有單獨加載一些shell的配置榴鼎,會繼承父shell的內(nèi)容等等伯诬。本著先記住,以后慢慢理解的原則巫财,我也就似懂非懂地決定先硬記住了盗似。
但是兩種子shell到底有什么區(qū)別呢?為什么一個能繼承父shell的環(huán)境平项,另一個卻不能呢赫舒?
今天無意中看到一篇帖子,里面解釋了SHLVL和BASH_SUBSHELL兩個變量闽瓢,讓這個疑惑迎刃而解号阿。
首先,借用一下大神對這兩個變量的定義:

SHLVL是記錄多個bash進(jìn)程實例嵌套深度的累加器
BASH_SUBSHELL是記錄一個bash進(jìn)程實例的多層subshell嵌套深度的累加器

如果概念比較不好理解鸳粉,讓我們通過例子來理解吧


1

2

圖1中,SHLVL值隨著bash命令執(zhí)行的次數(shù)增加园担,而BASH_SUBSHELL值不變届谈。本質(zhì)上說枯夜,這是通過執(zhí)行外部命令bash開啟了新進(jìn)程(而這個新進(jìn)程恰好也是shell進(jìn)程罷了),而SHLVL記錄了這種嵌套的shell進(jìn)程實例的層數(shù)艰山。這樣的child shell進(jìn)程是通過執(zhí)行硬盤上的命令來生成的湖雹,它是獨立的(會讀取加載/etc/profile.d/*.sh /etc/bashrc ~/.bashrc等bash配置文件),只能訪問所謂的"父"shell的環(huán)境變量曙搬。
而通過()開啟的叫做subshell的才是當(dāng)前shell名副其實的子shell摔吏,它可以訪問父shell的任何變量。圖2可以看到通過()開啟的子shell的嵌套層級數(shù)纵装。注意征讲,SHLVL的值是不變的,也就是沒有開啟新的child shell橡娄。

我們來看看進(jìn)程樹:

  1. bash


    SHLVL
SHLVL pstree
  1. () 因為執(zhí)行完小括號內(nèi)的命令后诗箍,subshell進(jìn)程會立馬結(jié)束,所以需要通過sleep命令來留住subshell進(jìn)程挽唉,進(jìn)而通過pstree -p命令觀察它


    ()

    () pstree

    從進(jìn)程樹上看滤祖,child shell和subshell他們都在當(dāng)前shell進(jìn)程(pid15036)后.不同點在于,child shell的$BASHPID和$$值相同瓶籽,subshell則沒有自己獨立$$值匠童,只有自己的$BASHPID.

翻譯成中文的時候籠統(tǒng)地管它們叫子shell。然而它們是有本質(zhì)上的區(qū)別的∷芩常現(xiàn)在你了解了嗎汤求?

補(bǔ)充:
An example of the difference between a subshell and a child process that happens to be a shell:



補(bǔ)充2:
通過管道,也能打開subshell


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茬暇,一起剝皮案震驚了整個濱河市首昔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糙俗,老刑警劉巖勒奇,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巧骚,居然都是意外死亡赊颠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門劈彪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竣蹦,“玉大人,你說我怎么就攤上這事沧奴《焕ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纲菌。 經(jīng)常有香客問我挠日,道長,這世上最難降的妖魔是什么翰舌? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任嚣潜,我火速辦了婚禮,結(jié)果婚禮上椅贱,老公的妹妹穿的比我還像新娘懂算。我一直安慰自己,他們只是感情好庇麦,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布计技。 她就那樣靜靜地躺著,像睡著了一般女器。 火紅的嫁衣襯著肌膚如雪酸役。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天驾胆,我揣著相機(jī)與錄音涣澡,去河邊找鬼。 笑死丧诺,一個胖子當(dāng)著我的面吹牛入桂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驳阎,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抗愁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呵晚?” 一聲冷哼從身側(cè)響起蜘腌,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饵隙,沒想到半個月后撮珠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡金矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年芯急,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶俊。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娶耍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饼酿,到底是詐尸還是另有隱情榕酒,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站奈应,受9級特大地震影響澜掩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杖挣,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刚陡。 院中可真熱鬧惩妇,春花似錦、人聲如沸筐乳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝙云。三九已至氓皱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勃刨,已是汗流浹背波材。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留身隐,地道東北人廷区。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像贾铝,于是被迫代替她去往敵國和親隙轻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355