[转帖]/etc/profile 和 /etc/profile.d/ 的区别

etc,profile,区别 · 浏览次数 : 0

小编点评

**/etc/profile.d/目录下的环境变量是全局环境变量,一旦生效后也都是永久环境变量** /etc/profile.d/目录下设置环境变量和 /etc/profile 效果是一样的,都是全局环境变量,一旦生效后也都是永久环境变量。 /etc/profile.d/目录下设置的环境变量和 /etc/profile 的优先级,根据环境变量在 /etc/profile 的 for 循环语句调用 /etc/profile.d 的前面还是后面,在前则被 /etc/profile.d 目录下的环境变量覆盖,在后则被 /etc/profile 的环境变量覆盖关于 /etc/profile.d 目录。 **推荐方法:将全局环境变量配置于 /etc/profile.d 目录下** 因为 /etc/profile.d 目录下的环境变量是全局环境变量,一旦生效后也都是永久环境变量,所以将全局环境变量配置于 /etc/profile.d 目录下是最佳的实践方式。

正文

https://my.oschina.net/calmsnow/blog/2989570

 

 

/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

与[转帖]/etc/profile 和 /etc/profile.d/ 的区别相似的内容:

[转帖]/etc/profile 和 /etc/profile.d/ 的区别

https://my.oschina.net/calmsnow/blog/2989570 /etc/profile 是文件, /etc/profile.d/ 是目录,用在设置环境变量方面,/etc/profile 文件和 /etc/profile.d/ 目录实现效果是一样的,可根据自己对环境变量配置

[转帖]/etc/profile和/etc/environment的区别

时间 2019-11-07 标签 profile environment 区别 繁體版 原文 https://my.oschina.net/u/2885925/blog/2989579 /etc/profile 文件 当一个用户登陆Linux系统或使用 su 命令切换到另外一个用户时,设置用户环境第

[转帖]resin的安装与配置

1.安装jdk 之前装过了,就不做演示了 vim /etc/profile //注意java的配置文件 JAVA_HOME=/usr/local/jdk1.8/ JAVA_BIN=/usr/local/jdk1.8/bin JRE_HOME=/usr/local/jdk1.8/jre PATH=$P

[转帖]采用cat与EOF组合添加多行内容时防止变量解析的解决办法

https://blog.51cto.com/xoyabc/1718355 【问题描述】 当采用cat与EOF组合添加多行内容时,若含有变量,则追加后的文件中是变量对应的的值,并不是变量本身。 如$a对应的值为111,执行以下命令后 cat >> /etc/profile << EOF $a $a

[转帖]nginx按日分割日志

https://www.cnblogs.com/leffss/p/7832123.html #!/bin/bash #按日切割nginx日志并压缩,加入crontab每天0:00切割 #作者:fafu_li #时间:2015.08.15 source /etc/profile #加载系统环境变量 s

[转帖]linux网络速率监控

https://www.cnblogs.com/leffss/p/7832074.html #!/bin/bash #作者:fafu_li #时间:2015.10.14 #监控网卡传输速率 source /etc/profile #加载系统环境变量 source $HOME/.bash_profil

[转帖]/etc/passwd文件 各个字段详解

转载自:https://www.sohu.com/a/320177323_505901 /etc/passwd文件: 系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读(r)操作。 查看文件内容: /etc/passwd文件内容非常规律,每行记录对应一个用户。 每行用

[转帖]Docker配置文件/etc/docker/daemon.json详解

该文件作为Docker Engine的配置管理文件,几乎涵盖了所有docker命令行启动可以配置的参数。默认是没有的,需要手动创建 docker- daemon.json各配置详解 { "allow-nondistributable-artifacts": [], #不对外分发的产品提交的regis

[转帖]Linux之/etc/fstab文件讲解

https://www.cnblogs.com/FengGeBlog/p/10178824.html /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系统启

[转帖]ssh时不输入YES

vim /etc/ssh/ssh_config 60行新添加 StrictHostKeyChecking no