gentos 执行sh文件_Centos /etc/profile.d目录下的.sh中声明的全局环境变量不生效

使用服务器部署软件,有时候需要自己编译,当编译安装完成后,我们需要设置环境变量,为了方便快捷的运行命令,而不必每次都使用绝对路径。

问题描述:

服务器安装完JDK环境后,习惯的在/etc/profile.d目录下写一个声明环境变量的脚本,比如:

export JAVA_HOME=/usr/local/javaexport PATH=$JAVA_HOME/bin:$PATH

需要使用命令:source /etc/profile.d/java.sh 使其生效。

偶尔的一次重启服务器之后,发现环境变量未生效,需要手动source 执行/etc/profile.d脚本使其生效。

问题排查:

  • 系统开机会执行/etc/profile脚本,脚本执行过程中,会for循环遍历/etc/profile.d目录下的.sh文件并执行。
  • 用户登录时,会执行/etc/bashrc脚本,脚本执行过程中,也会for循环遍历/etc/profile.d目录下的.sh文件并执行。
  • 代码:
 for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then if [ "$PS1" ]; then . "$i" else . "$i" >/dev/null fi fi done

问题解决过程:

  • 首先检查/etc/profile.d目录下声明环境变量的脚本是否可读
  • /etc/profile 系统开机时运行的脚本,发现此脚本里声明了很多全局变量,但是用户登录后,全部没有生效,说明此脚本中声明的PATH被后执行的脚本中的PATH覆盖了。
  • ~/.bash_profile 用户登录后执行的脚本,脚本里有一个条件判断语句,如果~/.bashrc文件存在则执行~/.bashrc,然后再声明PATH变量。
9cb42b5b2dddcb83766bc7b721773b87.png
  • ~/.bashrc 此脚本也有一条判断语句,如果/etc/bashrc存在,则执行/etc/bashrc
3269c7fc558fb10046d74bb970ca069b.png
  • /etc/bashrc 查看此脚本时,发现脚本的最后一行声明了PATH全局变量,这里的PATH把之前声明的PATH全部覆盖了。
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/git/bin

总结:

删除/etc/bashrc里的PATH声明,并整理/etc/profile里的环境变量的声明,一并移到/etc/profile.d目录下,而且官方也是建议这么做的,好处就是好管理,不会破坏系统脚本里的东西。

由此可以分析出,这4个脚本的执行顺序是:

开机执行/etc/profile,用户登陆shell后,执行~/.bash_profile,执行~/.bash_profile的过程中,会先执行~/.bashrc,执行~/.bashrc的过程中,会执行/etc/bashrc

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值