Linux 中的 Login Shell 是什么?
Login shell 是登錄到交互式會話(interactive session)時使用用戶 ID 執行的第一個進程。
這個解釋乍一看比較簡單,但仔細想想又有些模糊。為了便于理解,下面我們重新看一下 Linux 系統的登錄過程。
Linux 是一個多用戶的操作系統,可以允許多個用戶同時登錄和使用系統。
Linux 系統的第一個進程,不管是 init 還是 systemd,都會啟動 getty 程序。這個 getty,是“get tty”(tty表示物理或虛擬終端)的縮寫,負責保護系統免受未經授權的訪問。
當你嘗試連接到 Linux 系統(登錄本地系統,或者通過 ssh 連接遠程服務器)時,getty 會(通過登錄程序)提示你輸入用戶名,輸入完用戶名后,又會提示你輸入密碼。
登錄時輸入的信息(用戶名和密碼),系統會將其根據存儲在 /etc/passwd 中的信息進行驗證。/etc/passwd 文件中存儲的信息包含用戶名、用戶 ID、主目錄以及登錄成功后要啟動的第一個程序等。
如上圖所示,用戶 abhishek 登錄時啟動的第一個程序(針對 Linux 中的標準用戶),是 Login Shell。
字段中也可能有其他值。比如,sshd 是一個系統用戶,而不是一個真正的用戶,它不能像 abhishek 這樣的普通用戶那樣以交互方式登錄系統。如下所示:
如果第一個程序那一列中沒有信息,那么默認為 /bin/sh,即標準 shell。
Login shell 和 non-login shell
我們登錄到一個系統,知道它是一個 login shell,那么這意味著什么呢?是不是還有其他 shell 呢?
在 Linux 中,當你運行一個 shell 腳本時,它是在自己的 shell(非交互式 shell)中運行的。你可以在當前 shell(交互式 shell)中啟動一個新 shell。
從技術角度講,這些都是子 shell。
shell 的配置文件和 RC 文件
login shell 從 /etc/profile 和主目錄中的配置文件中讀取環境變量和其他配置,這得以讓我們可以使用 tab 補全鍵、設置彩色輸出以及其他內容(比如 umask)等。
你可能知道在 Linux 系統中可用不止一個 shell,大多數 Linux 發行版都默認使用 bash shell,你也可以安裝其他的 shell,比如 zsh 或者 Fish shell。
如果你的 login shell 是 bash,那么其配置文件為 /etc/profile 和 ~/.bash_profile,如果是 zsh,它的配置文件為 /etc/zprofile 和 ~/.zprofile。
/etc 目錄中的文件通常為系統中為用戶設置的各自 shell 的配置,這通常由系統管理員設置。
用戶主目錄中的文件是特定于用戶的。這允許用戶為常用命令創建別名或為程序使用自定義 PATH 變量。
non-login shell 源于 login shell,因此它通過配置文件獲取登錄shell設置的所有環境。除此之外,非登錄交互式shell可以通過/etc/home目錄中的rc(資源配置)文件定義自己的環境變量。
對于bash shell,通常是 /etc/bash.bashc 和 ~/.bashrc 文件,而對于zsh shell,則是 /etc/zshrc 和 ~/.zshrc 文件。
看下面的例子:
上圖中,shell 讀取 /etc/bash.bashrc 文件后,其提示符變成了綠色。Ubuntu 在該文件中添加了其他參數,顏色設置是其中之一。
概況一下:
- 配置文件用于交互式 login shell,rc 文件用于交互式 non-login shell;
- 首先執行/etc/directory中的文件,然后執行home目錄中的文件;
- 配置文件和 rc 文件同時作用于非交互式的 non-login shell。
如何查看當前是否在 login shell 中?
這非常簡單,至少對于 bash shell 來說是這樣。對于 login shell,shell 可執行文件的名稱以 - 開頭。對于non-login shell,它只是 shell 的名稱。
在桌面 Linux上,通常不使用 login shell,登錄由顯示管理器管理。這就是為什么當在 Linux 桌面上打開一個終端時,我們會看到即使是在終端中運行的第一個 shell 也不是login shell。