Subshell
Subshell#
Subshell 嘅定義喺一啲書本或者資料中模糊唔清,畀出嘅解釋往往同某啲例子自相矛盾,令人捉摸唔透。
所以,為咗避免呢種語義同邏輯上嘅問題,呢度唔會畀出佢嘅定義(建議參考官方 BASH 手冊),
亦唔會用 “子 Shell” 呢個翻譯,只係從佢嘅實際表現去理解佢嘅定義。
下面列舉嘅變量同 Subshell 概念有密切嘅關係。
BASH_SUBSHELL#
Shell 變量,非環境變量,官方手冊解釋。
亦可以用 man 命令,內容可能會有啲唔同。
SHLVL#
環境變量,官方手冊解釋。
用 man 命令。
呢個值係從 1 開始嘅。
命令分組#
全稱 Command Grouping,Bash 提供兩種方法創建命令分組。
括號:()#
呢個方法會創建一個 Subshell 環境去處理命令分組。
可以得出以下結論。
- BASH_SUBSHELL:每創建一個 Subshell 就加 1。
- SHLVL:無論創建幾多個 Subshell,都唔變。
花括號:{}#
呢個方法唔會創建 Subshell,命令分組係喺當前 Shell 嘅上下文中處理嘅。
喺語法上,花括號同命令之間嘅空格唔可以省略,每個命令結尾嘅分號亦係必須嘅。
Shell PID#
可以通過 BASHPID 或者 $$
睇 Shell 嘅 PID,但佢哋係有區別嘅。
BASHPID#
Shell 變量,非環境變量,官方解釋。
用 ()
睇 BASHPID。
可以睇到,BASHPID 輸出咗 Subshell 嘅 PID。
特殊參數 $$#
官方解釋。
喺 Subshell 中,$$
表示嘅係 invoking shell 嘅 PID。
可以睇到,無論有幾多個 Subshells,$$
始終表示頂層 Bash 嘅 PID。
創建 Bash 實例#
喺 Bash 中輸入 bash
就可以創建一個全新嘅 Bash 實例。
呢個時候再觀察一下上面提到嘅變量。
- BASH_SUBSHELL:冇變。
- SHLVL:從 1 -> 2。
- BASHPID:新 Bash 實例嘅 PID。
- $$:新 Bash 實例嘅 PID。
如果話呢種創建 Bash 嘅方式都係 Subshell 嘅話,語義同表現上就會自相矛盾。