在CentOS环境下环境变量(如PATH、JAVA_HOME)均通过配置文件来加载。
而登录Shell(Login Shell)与非登录Shell(Non-Login Shell)加载的配置文件不同,具体如下:
触发场景:用户通过SSH登录、终端登录(如tty1
~tty6
)、su - username
或bash -l
。
加载顺序:先加载系统级配置文件、再加载用户级配置文件。
/etc/environment
PATH
),由所有登录进程读取。/etc/profile
JAVA_HOME
)。/etc/profile.d/*.sh
/etc/profile
调用,按文件名顺序执行目录下所有脚本。~/.bash_profile
→ 若存在则加载并停止~/.bash_login
→ 若.bash_profile
不存在则加载~/.profile
→ 若前两者均不存在则加载。~/.bash_profile
会显式调用 ~/.bashrc
~/.bashrc
再调用 /etc/bashrc
/etc/bashrc
最终加载 /etc/profile.d/*.sh
。(没错,又去加载系统级配置了)典型
~/.bash_profile
内容# 调用 ~/.bashrc if [ -f ~/.bashrc ]; then . ~/.bashrc fi
触发场景:图形界面打开终端、su username
(无-
)、直接执行bash
命令。
加载顺序:
~/.bashrc
alias ll='ls -al'
。/etc/bashrc
~/.bashrc
调用,定义系统级函数和全局别名。/etc/profile.d/*.sh
/etc/bashrc
调用,确保模块化配置生效。(没错,又去加载系统级配置了)关键特性:不加载
/etc/profile
、~/.bash_profile
等登录专用文件。
典型
~/.bashrc
内容# 调用全局配置 if [ -f /etc/bashrc ]; then . /etc/bashrc fi
触发场景:运行Shell脚本(如./script.sh
)、Cron定时任务。
加载规则:
/etc/profile
或~/.bashrc
。BASH_ENV
变量指定文件export BASH_ENV=~/.bashrc
,则脚本执行前加载该文件。/etc/environment
/etc/profile
)。场景 | 推荐配置文件 | 说明 |
---|---|---|
全局环境变量 | /etc/profile.d/custom.sh |
避免修改/etc/profile ,便于维护。 |
用户私有环境变量 | ~/.bash_profile |
登录生效(如JDK路径)。 |
用户别名、函数 | ~/.bashrc |
终端即时生效(如alias ll='ls -l --color=auto' )。 |
Cron任务需用的变量 | 脚本内source 或直接写入/etc/environment |
Cron仅认/etc/environment 。 |
# 登录Shell配置更新后
source ~/.bash_profile
# 非登录Shell配置更新后
source ~/.bashrc
Shell类型 | 关键特征 | 核心加载文件(下面未完整列举配置文件内部再去调用其他配置文件的情况) |
---|---|---|
登录Shell | 需身份认证(如SSH) | /etc/profile → ~/.bash_profile → ~/.bashrc |
非登录Shell | 直接打开终端 | ~/.bashrc → /etc/bashrc |
非交互式Shell | 执行脚本 | 默认无,或通过BASH_ENV 指定 |
Cron任务 | 定时任务 | 仅/etc/environment |
理解记忆:
登录式 Shell 涉及用户,而用户其实就是一种身份(profile)。
非登录式 Shell,没有身份(profile),所以不会直接去调用 profile 相关的文件。
至于为什么 ~/.bashrc 会去调用系统级的配置,可以这么理解:rc 指 “run commands”。相关文献曾记载这一段话: 具有从档案中取出一系列命令来执行的功能;这称为 run commands。
若环境变量不生效,先检查当前Shell类型(echo $0
:-bash
为登录Shell,bash
为非登录Shell)。
建议都配置在 ~/.bashrc
文件中得了,因为登录式 shell 和非登录式 shell 默认都会加载该文件。
修改配置文件后,立刻 source ~/.bashrc
一下,让环境变量在当前会话立刻生效(否则下次打开新 shell 才生效)。