一般情况下,我们配置环境变量时,都是通过/etc/profile文件进行配置。
在环境变量配置不多时,我们的确可以这么做。但是环境变量要是很多呢?岂不是每次都要编辑这个文件,新增对应的环境变量。如果这样的话,我们要删除之前新增的环境变量,也只能在/etc/profile里慢慢找,逐个删除。这就很麻烦。
那有没有更好的办法呢?
有的,那就是使用/etc/profile.d/,在这个目录下新增环境配置文件即可。
/etc/profile.d/这个目录是用来干嘛的呢?简单来说,它和/etc/profile的功能可以说是一样的,系统启动或者用户重新登录shell后,这个目录下的.*sh文件会自动解析配置到环境变量中。看下/etc/profile里是怎么写的
那么使用/etc/profile.d/的好处是什么呢?那就是解耦环境变量。试想一下,我们在/etc/profile.d/配置了某个环境变量配置文件,什么时候我们不在需要这个环境变量了,我们只需要删掉这个.sh文件即可,不用再改/etc/profile,是不是就方便多了。
下面以JAVA环境配置为例:
新增编辑/etc/profile.d/java.sh,文件内容如下
JAVA_HOME=/usr/local/jdk1.8.0_301 JRE_HOME=/usr/local/jdk1.8.0_301/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export PATH
我们来验证下
[root@localhost profile.d]# grep JAVA_HOME /etc/profile #并没有在profile里配置JAVA_HOME [root@localhost profile.d]# cat /etc/profile.d/java.sh #我们在/etc/profile.d/目录下新增java.sh,并做JAVA环境变量配置 JAVA_HOME=/usr/local/jdk1.8.0_301 JRE_HOME=/usr/local/jdk1.8.0_301/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export PATH [root@localhost profile.d]# su - weblogic #现在我们切换用户 Last login: Fri Nov 5 00:39:57 CST 2021 on pts/3 [weblogic@localhost ~]$ echo $JAVA_HOME #JAVA_HOME变量已经有了 /usr/local/jdk1.8.0_301 [weblogic@localhost ~]$ java -version #可查看java版本,说明JAVA环境配置成功 java version "1.8.0_301" Java(TM) SE Runtime Environment (build 1.8.0_301-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode) [weblogic@localhost ~]$
题外话,顺便说下自己在研究这个/etc/profile.d过程中遇到的一个坑。事情是这样的,我之前二进制安装的mysql,mysql环境变量的配置,我是执行以下语句完成的。
echo "PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysqld.sh
可以看到,我其实也是直接用/etc/profile.d。咋一看好像并没有问题,PTAH=mysql变量加上$PATH。最后mysqld.sh的最终内容其实是
PATH=/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这种语句其实是有问题的。像/etc/profile.d下还有其他环境变量配置文件,一旦这个mysqld.sh不是最后一个执行的,就会导致最终PATH是/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
实际上,这个语句把我坑了一下午。我把mysqld.sh配置好后,系统和mysql都没有问题。但是在按照上面配置JAVA环境时,出现问题了,死活没有识别出java命令。下面是我一个排查过程
所以建议在使用echo命令,特别是带变量的,一定要特别注意下