使用者登入時的環境載入順序

lxd670發表於2024-09-26

1.配置檔案說明

系統級的配置檔案

配置檔案 描述
/etc/profile 系統級的全域性配置檔案,在使用者登入時由Bash首先讀取(如果是登入 shell)。
/etc/profile.d/* 這裡面的指令碼通常由/etc/profile呼叫,用於更靈活地進行系統級的環境變數設定和初始化任務等。
/etc/bashrc 為每一個執行bash shell的使用者執行此檔案,當bash shell被開啟時,該檔案被讀取,有些linux版本中的/etc目錄下已經沒有了bashrc檔案。

使用者級的配置檔案

配置檔案 描述
~/.bash_profile 使用者級的登入shell配置檔案,如果存在,在使用者登入時被讀取。
~/.bash_login 如果~/.bash_profile不存在,Bash 會嘗試查詢這個檔案作為使用者級登入 shell 的配置檔案。
~/.profile 如果前兩者都不存在,就執行這個檔案作為使用者級登入shell的配置檔案。
~/.bashrc 在某些情況下,如從登入shell啟動一個新的互動式非登入shell,或者在~/.bash_profile(或其他登入shell配置檔案)中顯式呼叫時,這個檔案會被讀取執行,用於設定互動式非登入shell的環境和別名等。
~/.bash_login 是一個使用者級的 Bash 配置檔案,主要在使用者退出Bash會話(尤其是互動式登入 shell 會話)時執行。

2.載入順序

shell互動式登入

stateDiagram-v2 shell登入 --> /etc/profile /etc/profile --> /etc/profile.d/* /etc/profile.d/* --> HOME HOME --> ~/.bashrc : 被前序指令碼觸發 ~/.bashrc --> /etc/bashrc : 被前序指令碼觸發 ~/.bashrc --> shell退出 : shell退出 --> ~/.bash_logout : 被自動觸發 state HOME { direction LR ~/.bash_profile --> ~/.bash_login : 不存在觸發 ~/.bash_login --> ~/.profile : 不存在觸發 }

非shell互動式登入

  • 1.如透過某些特殊方式啟動非互動式shell並明確指定載入~/.bashrc
  • 2.或者從一個已經載入了~/.bashrc的互動式shell啟動非互動式shell且有機制將當前環境傳遞給新的shell,可能會間接導致~/.bashrc的部分效果在非互動式shell中體現。
stateDiagram-v2 direction LR 非互動式shell --> ~/.bashrc : 有可能被載入 非互動式shell --> /etc/bashrc : 有可能被自動載入 ~/.bashrc --> /etc/bashrc : 有可能被前序指令碼觸發

3.示例

~/.bash_profile

#!/bin/bash

# ...其他內容

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

~/.bashrc

#!/bin/bash

# ...其他內容

if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

相關文章