适用环境:Ubuntu 22.04 LTS 默认 Bash。先用
echo "$SHELL"确认自己使用的是 Bash;Zsh、Fish 有不同的加载规则。
最简原则:交互式终端行为放 .bashrc,登录后只需执行一次的环境设置放 .profile。不要把同一段初始化同时复制到多个文件,否则每打开一个终端都可能重复追加 PATH 或启动工具。
Ubuntu 22.04 中三个文件的角色
| 文件 | 通常何时读取 | 合适内容 |
|---|---|---|
~/.bashrc | 每个交互式 Bash 终端 | 别名、提示符、补全、交互工具初始化 |
~/.profile | 图形登录,或 Bash 没有前两个登录配置时的登录 shell | PATH、登录环境变量;Ubuntu 默认模板通常让它加载 .bashrc |
~/.bash_profile | Bash 登录 shell;优先级高于 .profile | 仅在自己明确需要 Bash 专用登录配置时创建 |
系统级配置应单独看待:/etc/profile 负责登录 shell 的全局环境设置,并可能加载 /etc/profile.d/ 下的脚本;Ubuntu 的交互式 Bash 全局配置通常是 /etc/bash.bashrc,不是一些教程中写的 /etc/bashrc。
Bash 登录时的优先顺序
Bash 作为登录 shell 时,依次尝试读取:
~/.bash_profile- 不存在时读取
~/.bash_login - 前两者都不存在时读取
~/.profile
三者只会命中其中一个。Ubuntu 的默认 ~/.profile 通常会在交互式 Bash 环境中加载 ~/.bashrc;一旦自行新建 .bash_profile,Bash 就不再自动读取 .profile。如果确实要创建它,通常应显式加载 .profile,避免丢失系统默认的 PATH 设置:
| |
修改后的即时验证
| |
source 只影响当前终端。对图形登录环境变量、输入法或桌面程序,应该注销再登录,不要仅凭当前终端的结果判断成功。
常见误区
不要把需要用户交互的命令、会输出大量文字的命令或启动 GUI 程序写进 .profile。它们可能在登录管理器、远程会话或脚本中被调用,造成登录变慢或环境异常。
另一个常见误解是“每个 shell 脚本都会读取 .bashrc”。默认的非交互式 Bash 不会读取 ~/.bashrc;只有显式 source,或设置了 BASH_ENV 时才可能读取额外配置。因此,脚本所需的环境变量应在脚本、systemd 单元或项目环境中明确声明。对于 nvm、conda 等工具,优先复制其官方安装器给出的单一初始化片段,并放到对应 shell 的推荐文件。
出处
- 原始参考:Linux 文件 profile、bashrc、bash_profile 区别(linux技术栈,知乎)
- 手册参考:GNU Bash Manual:Bash Startup Files
本文已依据补充提供的原始 HTML 核对其登录配置顺序,并修正了 /etc/bashrc 路径和“.bashrc 会被所有脚本读取”等不适用于 Ubuntu 22.04 的表述。