一般情況下,我們配置環境變量時,都是通過/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命令,特別是帶變量的,一定要特別注意下