/etc/profile
是文件, /etc/profile.d/
是目录,用在设置环境变量方面,/etc/profile
文件和 /etc/profile.d/
目录实现效果是一样的,可根据自己对环境变量配置的需求场景,选择一种最好的方式来配置环境变量,一般应用场景下,全局变量配置于 /etc/profile.d
目录下是最佳的实践方式,/etc/profile.d/
比 /etc/profile
好维护。
/etc/profile 文件
当一个用户登录 Linux 系统或使用 su
命令切换到另一个用户时,设置用户环境第一个读取的文件就是 /etc/profile
,此文件为系统全局变量配置文件,且仅仅在第一次登录系统时才会全局运行 /etc/profile
。
注意上面描述的几个关键:
设置用户环境第一个读取的脚本文件
可以推理出在它之后读取的文件设置环境变量将会会覆盖/etc/profile
文件中配置的环境变量;仅仅在第一次登录系统时才会全局运行 /etc/profile
可以解释一个场景:我们在使用 Ubuntu 等桌面 Linux 系统时,用快捷键ctrl+alt+t
打开的 shell 终端里,修改环境变量后使用source /etc/profile
这个命令执行生效,新的环境变量只能在当前的终端里面有效,打开新的 shell 终端时,刚才有效的环境变量在新的终端是不生效的;所以全局生效/etc/profile
环境变量的正确方式是注销重登录或者直接重启系统
以添加 JDK 的环境变量为例子,vim /etc/profile
打开文件, 在文件最后添加:
export JAVA_HOME=/opt/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
/etc/profile.d/ 目录
在 /etc/profile.d
目录中存放的是一些应用程序所需的启动脚本,比如 vim 等命令的一些附加设置,在 /etc/profile.d
目录下添加相关的环境变量设置的 .sh
脚本文件,这些脚本文件的环境变量能够被生效,是因为在 /etc/profile
被读取的时候,会使用一个 for 循环语句来调用 /etc/profile.d
下的脚本,这些脚本文件所设置的环境变量就和 /etc/profile
启动时一起被设置起来了,cat /etc/profile
可以看到有一段加载 /etc/profile.d
目录下所有 .sh
脚本文件的代码:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
从上面的代码不难理解,/etc/profile.d/
目录下设置环境变量和 /etc/profile
效果是一样的,都是全局环境变量,一旦生效后也都是永久环境变量; /etc/profile.d/
比 /etc/profile
好维护,不想要的环境变量从 /etc/profile.d/
目录中移除即可,创建好的环境变量拷贝文件就轻松的移植到其他的计算机,不用每次去改动 /etc/profile
文件。
根据上面描述可以推理出:
/etc/profile.d
目录下的环境变量是/etc/profile
启动时一起被读取,那么想要在当前 shell 终端临时生效可以使用source /etc/profile
,要全局生效则需要注销重登录或者直接重启系统,和/etc/profile
原理一样;/etc/profile.d
目录下的环境变量和/etc/profile
的环境变量优先级,根据环境变量在/etc/profile
的 for 循环语句调用/etc/profile.d
的前面还是后面,在前则被/etc/profile.d
目录下的环境变量覆盖,在后则被/etc/profile
的环境变量覆盖
关于 /etc/profile.d
目录,我使用我的 Ubuntu 14.04.5 系统,切换到 /etc/profile.d
目录,再使用 ls
命令列出目录下的所有脚本文件:
cd /etc/profile.d && ls
Ubuntu 14.04.5 在 /etc/profile.d
目录下默认带有这三个文件 appmenu-qt5.sh
bash_completion.sh
vte.sh
:
bash_completion.sh
是一个bash-completion
软件包的脚本,这个脚本的作用是规定我们使用Tab
键自动补全命令以什么样的参数去补全,有兴趣的可以自行深入了解;
还是以添加 JDK 的环境变量为例子,使用命令 sudo vim /etc/profile.d/java.sh
创建并编辑 java.sh
文件 (文件名可自行定义, .sh
类型即可),在文件中填如下面的内容:
# java env
export JAVA_HOME=/opt/jdk1.8.0_192
export PATH=$JAVA_HOME/bin:$PATH