centos环境变量加载顺序

在CentOS环境下环境变量(如PATH、JAVA_HOME)均通过配置文件来加载。

而登录Shell(Login Shell)与非登录Shell(Non-Login Shell)加载的配置文件不同,具体如下:

一、登录Shell(Login Shell)加载的文件

触发场景:用户通过SSH登录、终端登录(如tty1~tty6)、su - usernamebash -l
加载顺序:先加载系统级配置文件、再加载用户级配置文件。

  1. /etc/environment
    系统级环境变量文件(如PATH),由所有登录进程读取。
  2. /etc/profile
    全局配置文件,定义系统级环境变量(如JAVA_HOME)。
  3. /etc/profile.d/*.sh
    /etc/profile调用,按文件名顺序执行目录下所有脚本。
  4. 用户级配置文件(按优先级顺序)
    • ~/.bash_profile → 若存在则加载并停止
    • ~/.bash_login → 若.bash_profile不存在则加载
    • ~/.profile → 若前两者均不存在则加载。
  5. 嵌套加载
    • ~/.bash_profile 会显式调用 ~/.bashrc
    • ~/.bashrc 再调用 /etc/bashrc
    • /etc/bashrc 最终加载 /etc/profile.d/*.sh(没错,又去加载系统级配置了)

典型 ~/.bash_profile 内容

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

二、非登录Shell(Non-Login Shell)加载的文件

触发场景:图形界面打开终端、su username(无-)、直接执行bash命令。
加载顺序

  1. ~/.bashrc
    用户私有配置(别名、函数、局部变量),如alias ll='ls -al'
  2. /etc/bashrc
    ~/.bashrc调用,定义系统级函数和全局别名。
  3. /etc/profile.d/*.sh
    /etc/bashrc调用,确保模块化配置生效。(没错,又去加载系统级配置了)

关键特性:不加载 /etc/profile~/.bash_profile 等登录专用文件。

典型 ~/.bashrc 内容

# 调用全局配置
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

三、特殊场景:非交互式Shell(如脚本执行)

触发场景:运行Shell脚本(如./script.sh)、Cron定时任务。
加载规则

  1. 默认不加载任何配置文件
    脚本继承父Shell的环境变量,但自身不主动加载/etc/profile~/.bashrc
  2. 可通过BASH_ENV变量指定文件
    若设置export BASH_ENV=~/.bashrc,则脚本执行前加载该文件。
  3. Cron任务仅加载/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类型 关键特征 核心加载文件(下面未完整列举配置文件内部再去调用其他配置文件的情况)
登录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 类型

若环境变量不生效,先检查当前Shell类型(echo $0-bash为登录Shell,bash为非登录Shell)。

环境变量配置建议
  1. 建议都配置在 ~/.bashrc 文件中得了,因为登录式 shell 和非登录式 shell 默认都会加载该文件。

  2. 修改配置文件后,立刻 source ~/.bashrc 一下,让环境变量在当前会话立刻生效(否则下次打开新 shell 才生效)。

参考

  • LInux 环境变量配置

你可能感兴趣的:(Linux,centos,chrome,python,linux)