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/ 的区别的更多相关文章

  1. linux下 /etc/profile、~/.bash_profile ~/.profile的执行过程

    关于登录linux时,/etc/profile.~/.bash_profile等几个文件的执行过程. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile ...

  2. profile和bashrc四种的区别

    Linux下profile和bashrc四种的区别 12160阅读 0评论 /etc/profile./etc/bashrc.~/.bash_profile.~/.bashrc很容易混淆,他们之间有什 ...

  3. [转] linux下 /etc/profile、~/.bash_profile ~/.profile的执行过程

    分类: linux 2015-03-13 16:24 1572人阅读 评论(0) 收藏 举报linuxprofile关于登录linux时,/etc/profile.~/.bash_profile等几个 ...

  4. Linux 环境下/etc/profile和/etc/profile.d 的区别

    Linux 环境下/etc/profile和/etc/profile.d 的区别 区别: 1. 两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/pro ...

  5. /etc/profile和~/.bash_profile等文件的区别和联系

    对比说明:/etc/profile:为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效.当被修改时,必须重启才会生效.英文描述:”System wi ...

  6. Linux的环境变量配置在/etc/profile或/etc/profile.d/*.sh文件中的区别是什么?

    @ 目录 login shell non-login shell 它们的区别 Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,~/.bash ...

  7. ZHA profile与ZLL profile的一个例子

    ZHA Coordinator 如何控制ZLL Light/Philips Hue Light 缩写: ZHA: ZigBee Home Automation profile ZLL:  ZigBee ...

  8. linux中/etc/profile、/etc/profile.d/、/etc/bashrc、~/.bashrc、~/.bash_profile、~/.bash_logout的作用与区别

    作用: /etc/profile:登录时用来设置环境变量,执行文件中的命令,对所有用户生效. /etc/profile.d/:登录时和执行bash命令打开子shell时执行目录下所有已.sh结尾的脚本 ...

  9. 【原创】android 7.0 通知报错 java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group

    项目中在后台发送通知,突然某一天测出在Android 7.0上通知发送失败,那么根据提示,我们尝试加了MANAGE_USERS权限,看起来是个系统级别权限,验证后果然无效.接着在搜索后都无果,似乎大家 ...

  10. [转帖] IIS经典模式和集成模式的区别

    在 IIS 7.0 中,应用程序池有两种运行模式:集成模式和经典模式. https://blog.csdn.net/hongwei_23/article/details/44300923 这里面添加一 ...

随机推荐

  1. 带你用VUE实现上传图片效果

    摘要:在逛b站时看到一个上传图片的效果,想着可以自己也做一个,因为原作者是用原生js写的,那我不如就用vue写好了,当然,是一个很小的东西,在HTML文件直接引用vue就好了,详细步骤如下~ 本文分享 ...

  2. 总结vue3 的一些知识点:MySQL 运算符

    MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算 ...

  3. 火山引擎 DataTester :让字节“跳动”起来的 A/B 实验平台

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流 火山引擎 DataTester 不仅对外提供服务,同时也是当前字节跳动内部所应用的 AB 实验平台. DataTes ...

  4. PMP 如何获取 PDU PMP 证书续证

    PMP 如何获取 PDU. PMP 证书续证  需要准备一张带支付美元的信用卡 打开官网,登录: https://ccrs.pmi.org/   内容随便填 ,可以到 https://pmichina ...

  5. 通过mongo-driver使用说明 GO 包管理机制

    本篇记录通过GO语言操作mongodb,实现的流程包括: 初始化项目工程 容器方式安装mongo 调试运行和编译运行 go使用mongo的代码如下,go操作mongo的SDK是mongo-driver ...

  6. 别再问我 2050 可以干什么,Make a Movie in a Day!

    2050 的每个年青人都是新物种.越是不可能见面的人见了面,就越会有奇迹发生,2050 努力让年青人见上另一位年青人,激发新的创造力.一起来 2050 看看? 2050 是什么? 2050 大会是由阿 ...

  7. GIL 锁或将在 CPython 中成为可选项

    哈喽大家好,我是咸鱼 几天前有媒体报道称,经过多次辩论,Python 指导委员会打算批准通过 PEP 703 提案,让 GIL(全局解释器)锁在 CPython 中成为一个可选项 PEP 703 提案 ...

  8. 0x53 动态规划-区间DP

    A: 石子合并 所求问题:1到n这些石子合并最少需要多少代价 由于石子合并的顺序可以任意,我们将石子分为两个部分 子问题:1到k这堆石子合并,k+1到n这堆石子合并,再把两堆石子合并,需要多少代价\( ...

  9. Sentinel 是如何做限流的

    限流是保障服务高可用的方式之一,尤其是在微服务架构中,对接口或资源进行限流可以有效地保障服务的可用性和稳定性. 之前的项目中使用的限流措施主要是Guava的RateLimiter.RateLimite ...

  10. JAVA使用Session获取用户信息

    JAVA使用Session获取用户信息 1. 在登录的Controller中将用户信息塞入Session //前端传入用户信息 @RequestMapping("/login") ...