关键在于区分shell启动类型:登录shell加载~/.bash_profile(或~/.profile),非登录交互式shell加载~/.bashrc;系统级变量应放入/etc/profile.d/*.sh,避免直接修改全局文件。
环境变量配置的关键,在于分清 shell 启动类型和配置文件职责。登录 shell 加载 .bash_profile(或 .profile),非登录交互式 shell(比如图形界面新开终端)加载 .bashrc。混用或错放配置,就会出现“本地能用、SSH 上失效”“改了不生效”等问题。
登录 shell 是真正“认证进入系统”的过程:通过 SSH 远程连接、Ctrl+Alt+F2 切换到 TTY、图形界面首次登录,都属于登录 shell。它会依次执行:
非登录 shell 是在已登录状态下启动的新 shell,例如 GNOME Terminal 新建窗口、iTerm2 新建标签页、或在当前终端里敲 bash。它不走 profile 链,只加载:
只放影响整个会话生命周期的环境变量和一次性的启动逻辑,比如 PATH 扩展、LANG、NODE_PATH、JAVA_HOME 等。这些变量需要被所有子进程继承。
export 显式导出,否则只是局部变量[[ ":$PATH:" != *":$HOME/bin:"* ]] && export PATH="$HOME/bin:$PATH"
.bashrc(如果希望登录 shell 也支持别名):if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
专注交互体验提升:别名、shell 函数、命令提示符(PS1)、历史记录设置、补全规则等。这些不需要跨会话持久,但需在每个新终端立即可用。
alias ll='ls -laF --color=auto'
mkcd() { mkdir -p "$1" && cd "$1"; }
不要直接修改 /etc/profile 或 /etc/bashrc。系统升级可能覆盖它们,而且容易引发权限或语法错误。
chmod +x /etc/profile.d/myenv.sh