HOWTO · Linux

登入 Shell 和非登入 Shell 之間的區別

本教程解釋了基於 UNIX 的系統中登入 shell 和非登入 shell 之間的區別。

本頁內容

本教程解釋了基於 UNIX 的系統中登入 shell 和非登入 shell 之間的區別。

什麼是基於 UNIX 的系統中的 Shell

基於 UNIX 的系統中的 shell 是使用者和作業系統核心之間的介面。它從使用者那裡獲取輸入並將其傳送到核心,並將結果從核心獲取到使用者。

有兩種型別的 shell,登入 shell 和非登入 shell。

每個 shell 在啟動後都會執行一系列啟動指令碼來設定環境。這些指令碼有不同的用途,它們都會影響環境。

後續指令碼可以覆蓋先前指令碼設定的值。

什麼是基於 UNIX 的系統中的登入 Shell

登入 shell 是使用 /bin/login 通過讀取 /etc/passwd 檔案成功登入後啟動的第一個程序。登入 shell 在你的使用者 ID 下執行。

當你使用終端登入、切換到另一個使用者或使用 SSH 時,會執行登入 shell。

一旦登入 shell 啟動,它就會執行一組啟動指令碼來設定 shell 環境。執行以下指令碼。

  1. 登入過程執行/etc/profile
  2. /etc/profile 執行 /etc/profile.d 中的指令碼
  3. 登入過程執行~/.bash_profile
  4. ~/.bash_profile 執行 ~/.bashrc
  5. ~/.bashrc 執行 /etc/bashrc

以下命令用於指示 shell 是否為登入 shell。

echo  $0

得到 -bash-su 作為輸出表明 shell 是一個登入 shell。記下輸出前的 - 符號。

在下圖中,echo $0 命令的輸出在 bash 前面有一個 -。它表明 shell 是一個登入 shell。

登入 shell

什麼是基於 UNIX 的系統中的非登入 Shell

登入 shell 啟動一個非登入 shell。它可以是一個以沒有登入的程序啟動的 shell,也可以是從另一個 shell 啟動的 shell。程序使用 shell 可執行檔案的名稱來啟動非登入 shell。

將 bash shell 作為非登入 shell 執行會執行以下指令碼。

  1. 非登入程序執行~/.bashrc
  2. ~/.bashrc 執行 /etc/bashrc
  3. /etc/bashrc 執行 /etc/profile.d/

要確定 shell 是否為非登入 shell,請執行以下命令。

echo $0

如果輸出是 bashsu 而沒有前面的 - 符號,則 shell 是非登入 shell。

我們執行下圖中的 echo $0 命令,輸出顯示 bash 前面的 -。這意味著我們正在使用登入 shell。

要啟動一個非登入 shell,我們輸入 shell 可執行檔案的名稱,在我們的例子中是 bash。我們再次執行 echo $0 命令來檢視新啟動的 shell 是什麼型別的 shell; echo 命令的輸出是 bash 沒有 -。這意味著新 shell 是非登入 shell。

非登入 shell