Shell 嘅啟動過程
Shell 嘅啟動方式#
Shell 嘅啟動方式會影響環境變量嘅加載過程,可以分為以下幾種。
- 互動式(Interactive)
- 登錄:以登錄方式啟動嘅 Shell 實例,例如 SSH 登錄。
- 非登錄:
- 喺 Shell 中輸入 Bash 新建 Shell 實例。
- 喺 GNOME Terminal 中打開一個新嘅終端會話。
- 非互動式(Non-Interactive)
乜嘢係互動式 Shell#
互動登錄式#
喺 Ubuntu 中,使用 SSH 登錄時,文件嘅加載流程大致如下。
/etc/profile
:入口文件 - A,所有用戶都會執行。/etc/bash.bashrc
:全局環境配置文件,A 會加載此文件。/etc/profile.d
:全局環境配置目錄,A 會加載此目錄嘅所有文件。~/.profile
:用戶環境配置入口文件 - B。~/.bashrc
:用戶環境配置文件,B 會加載此文件。
rc(Run Commands),源於 Unix 傳統。
/etc/profile#
system-wide
:系統範圍嘅配置文件。
/etc/bash.bashrc#
文件內容有啲多,就睇幾行註釋吧。
如果唔係互動式(PS1 變量冇設置),則直接退出。
/etc/profile.d#
睇一睇目錄嘅文件就好啦。
~/.profile#
呢個文件會去加載我哋常常用到嘅 ~/.bashrc
文件。
看頭部註釋可以得知,如果 ~/.bash_profile
同 ~/.bash_login
存在咗話,~/.profile
係唔會被加載嘅,文件加載順序如下。
~/.bashrc#
下面分析一下頭部就差不多啦。
看第一行註釋,呢個文件會被非登錄 Shell 執行。
前面講到 ~/.profile
文件亦會加載呢個文件,也就係講登錄式 Shell 同非登錄式 Shell 都會用到呢個文件。
再來分析一下呢啲魔法代碼(真係天才設計🤪):
$-
係一個特殊變量,表示當前 Shell 運行時啟用嘅選項,可以打印出來。
*i*
係一個匹配條件: $-
中是否包含 i
。i
選項表示當前 Shell 係互動式嘅。- 如果匹配成功,會退出 case。
- 如果匹配失敗,會執行 return,退出當前腳本。
總結:如果唔係喺互動式中運行,直接退出,唔做咩。
互動非登錄式#
呢度討論嘅係非登錄嘅情況。例如:
- 喺 Shell 中輸入 Bash 新建一個 Shell 實例。
- 使用
()
執行命令分組時生成嘅 Subshell。 - 喺 GNOME Terminal 中打開一個新嘅終端會話。
一句話總結:唔加載 /etc/profile
,只加載 ~/.bashrc
。
非互動式#
呢種方式冇命令行提示符,唔會加載任可配置文件,即使手動加載 ~/.bashrc
,亦唔會生效。
因為上面嘅分析裡提到,喺非互動式中,會直接退出,唔做咩。
當然,你可以使用 BASH_ENV 變量嚟設置加載嘅文件,解釋如下。
環境變量嘅持久化#
只需把環境變量寫喺對應嘅文件中,如:~/.bashrc
。