Linux 中的 subshell 是什么?

除了 shell 之外,還有一個(gè) subshell 的概念。
什么是 subshell
subshell 基本上就是一個(gè)新的 shell,只用于運(yùn)行所需的程序。subshell 可以訪問 “父 shell” 設(shè)置的全局變量,但是不能訪問局部變量;subshell 對(duì)全局變量所作的任何更改都只限于當(dāng)前 subshell 會(huì)話內(nèi),不會(huì)傳遞到 “父 shell”中。
接下來我們根據(jù)幾個(gè)實(shí)際例子來詳細(xì)介紹一下。首先看下面腳本,一個(gè)顯示變量 var 的單行代碼:
我將這個(gè)變量的值設(shè)置為 字符串"LHB",那么大家猜一下,運(yùn)行結(jié)果會(huì)怎樣?

奇怪吧,腳本并沒有打印我設(shè)置的變量值。
Shell 腳本在子Shell中運(yùn)行(默認(rèn)情況下)
為什么會(huì)出現(xiàn)上面的情況呢?因?yàn)楫?dāng)你在運(yùn)行 shell 腳本時(shí),它會(huì)在自己的 shell 中運(yùn)行。由于此 shell 源自于另一個(gè) shell(設(shè)置變量和運(yùn)行腳本的地方),因此稱為子 shell(即 subshell)。
shell 腳本無法讀取變量的值,因?yàn)樗且粋€(gè)局部變量,并且新創(chuàng)建的 shell 不知道這個(gè)值。如果你希望 subshell 可以訪問這個(gè)變量,那么需要使用 export 命令將其轉(zhuǎn)為全局變量。

你可以在當(dāng)前 shell 中新啟動(dòng)一個(gè) shell 來創(chuàng)建 subshell,只需運(yùn)行 bash,即可進(jìn)入一個(gè) subshell。在 subshell 中運(yùn)行 exit 命令即可退出 subshell 并回到原 shell 中。

但是新創(chuàng)建的 subshell 并不會(huì)打開一個(gè)新的窗口,它還是在當(dāng)前窗口中,不過已經(jīng)是一個(gè)新的 shell 了。
上面例子中我使用了一個(gè)變量來展示兩個(gè) shell(父 shell 和子 shell)的區(qū)別。當(dāng)變量 var 沒有導(dǎo)出時(shí)(使用 export),子 shell 是不能讀取到的。
嵌套 subshell
你可以以相同的方式創(chuàng)建嵌套 subshell。變量導(dǎo)出后(export),它在隨后創(chuàng)建的所有 subshell 中都可用。
你可以在 subshell 中修改導(dǎo)出后的變量的值,更改后的值也會(huì)傳遞給后續(xù) subshell 中(因?yàn)樽兞勘旧硎侨肿兞浚?,但是?dāng)你退出 subshell 而回到原先的 shell 后,變量還是最初的原始值。

為什么呢?因?yàn)榈教幾兞康闹当粡?fù)制到 subshell,它是一個(gè)副本(從 LHB 變?yōu)?HOC),在父 shell 中還是保留著原始值。
所以,需要記住的是:無法在 subshell 中更改父 shell 中的變量。無論該變量是否導(dǎo)出,在 subshell 中對(duì)變量做的修改不會(huì)影響到父 shell。

在當(dāng)前 shell 中執(zhí)行 shell 腳本
默認(rèn)情況下,一個(gè) shell 腳本是在自己的 shell(即 subshell)中執(zhí)行的。但是你可以修改這個(gè)默認(rèn)情況,即將 shell 腳本在當(dāng)前 shell 中執(zhí)行,通過 shell 內(nèi)置命令 . 來實(shí)現(xiàn)。
具體怎樣實(shí)現(xiàn)呢?不是這樣 ./script,而是如下這種方式:
這樣,腳本中的命令就會(huì)在當(dāng)前 shell 中執(zhí)行,就像這些命令被直接鍵入終端中一樣,而不是在 subshell 中運(yùn)行。腳本可以通過這種方式來訪問局部變量。
















 
 
 













 
 
 
 