为什么配置在source /etc/profile中的环境变量没有生效?
Linux环境变量配置在~/.bash_profile、/etc/profile、~/.bashrc、/etc/bashrc、/etc/profile.d中有什么区别?什么是 login shell,什么是 no login shell?本文将带你深入了解 profile 运行机制。
目录
运行环境:CentOS-7.9.2009-x86_64
~/.bash_profile
当前用户专属的启动文件,可根据不同用户定制不同的环境变量。
触发时机:每当创建新的shell终端或ssh登入调用(即 no login shell)
/etc/profile
所有用户的环境变量,统一配置。
触发时机:每次开机并成功登录Linux系统将调用(即 login shell)
/etc/profile.d/*.sh
用于存放自定义shell脚本,可供所有授权用户调用,可认为其为全局变量。
触发时机:每当登入系统 或 有新建的shell终端(包括非交互的定时任务) 都会调用
优点:
注意:
- # 授予文件执行权限(如:java.sh)
- chmod u+x /etc/profile.d/java.sh
-
- # 使配置立即生效,其将作用于所有已创建shell新执行的命令
- source /etc/profile.d/java.sh
当登录Linux系统时,bash shell会作为登录shell启动。登录shell会从以下几个文件中读取:
点击下图查看高清大图
关于 /etc/profile.d/目录下脚本的调用,见shell代码中注释说明。
原文:
Only display echos from profile.d scripts if we are no login shell and interactive - otherwise just process them to set envvars.
译文:
如果是非登录的shell或交互(模式),则只显示来自 /etc/profile.d/ 的自定义脚本,否则只以(普通)环境变量处理它们。
总结:无论是 在交互模式或shell模式,都会触发 /etc/profile.d/ 下的脚本调用。在 /etc/profile.d目录下创建脚本,将实现真正的全局环境变量。