四大配置檔對照
| 檔案 | 作用域 | 載入時機 | 典型用途 |
/etc/profile | 全域(所有用戶) | 登入 Shell 啟動時 | 環境變數、PATH、umask、系統級別別名 |
/etc/bash.bashrc | 全域(所有用戶) | 互動式非登入 Shell 啟動時 | 提示符、別名、函數、歷史紀錄設定 |
~/.profile | 用戶級 | 登入 Shell 啟動時 | 用戶專屬環境變數、啟動程式 |
~/.bashrc | 用戶級 | 互動式非登入 Shell 啟動時 | 用戶別名、函數、提示符、本地工具路徑 |
Shell 類型判斷
# 登入 Shell:登入過程、su -、bash --login
# 非登入 Shell:圖形終端開啟、bash、腳本執行
# 互動式:有提示符、可輸入指令
# 非互動式:腳本執行、命令替換 $(cmd)
載入順序流程圖
登入 Shell (bash --login)
│
├─→ /etc/profile
│ │
│ └─→ /etc/profile.d/*.sh
│
├─→ ~/.profile
│ │
│ └─→ (通常會 source ~/.bashrc)
│
└─→ ~/.bash_profile (若存在,取代 ~/.profile)
互動式非登入 Shell (打開終端)
│
├─→ /etc/bash.bashrc
│
└─→ ~/.bashrc
關鍵差異總結
- 登入 vs 互動:
profile 系列給登入 Shell,bashrc 系列給互動式 Shell
- 全域 vs 用戶:
/etc/ 影響所有用戶,~/ 僅影響當前用戶
- 父子關係:用戶級設定繼承全域設定,可覆蓋或擴充
- 即時生效:修改後執行
source ~/.bashrc 或 source ~/.profile 立即生效
最佳實踐建議
# ~/.bash_profile 或 ~/.profile
# 載入 .bashrc 確保互動式設定在登入 Shell 也生效
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
# ~/.bashrc
# 僅在互動式模式執行
[[ $- != *i* ]] && return
# 這裡放別名、提示符、函數等
alias ll='ls -alF'
alias grep='grep --color=auto'
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
補充:其他相關檔案
~/.bash_logout:登出時執行(清理暫存、記錄登出時間)
/etc/environment:PAM 環境變數,不支援腳本語法,僅 KEY=VALUE
~/.pam_environment:用戶級 PAM 環境變數