说明:在研究中发现,对于不同版本的Linux系统有着不同的文件,但是总的入口是不变的/etc/profile,下面只是展示加载顺序的研究过程,所以会有些系统没有这个文件等问题。
一、配置文件与作用域:
1、系统级别:
/etc/environment:在登录时操作系统使用的文件,系统在读取profile前,设置环境文件的环境变量。
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。设定的变量(全局)的可以作用于任何用户。
/etc/bashrc:为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。(一般这个文件是在调用~/.bashrc时调用/etc/bashrc,但是有些系统不会这么调用)(有些系统为/etc/bash.bashrc,可能有关系,也可能没关系)
2、用户级别:
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的.bashrc文件。(注意:该文件查找过程是依次查找~/.bash_profile、~/.bash_login、~/.profile三个配置文件,并且读取第一个找到的并且可读的文件为止。)
~/.pam_environment:当用户第一次登录时,该文件被执行。(有些系统为~/.env)(Ubuntu上有这个文件,参考:https://help.ubuntu.com/community/EnvironmentVariables)
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。
以上设定的变量(局部)只能继承/etc/profile中的变量,他们是“父子”关系。
~/.bash_history:存储用过的shell命令历史记录。应该是每次打开新的shell时就读取。
3、/etc/profile和/etc/environment等各种环境变量设置文件的用处
先将export LANG=zh_CN加入/etc/profile,退出系统重新登录,登录提示显示英文。
将/etc/profile中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。
用户环境建立的过程中总是先执行/etc/profile然后在读取/etc/environment。为什么会有如上所叙的不同呢?
应该是先执行/etc/environment,后执行/etc/profile。
/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。
系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,象日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。
对于用户的shell初始化而言是先执行/etc/profile,再读取文件/etc/environment。对整个系统而言是先执行/etc/environment。这样理解正确吗?
/etc/enviroment->/etc/profile->$HOME/.profile->$HOME/.env(如果存在,有些系统是.pam_environment)
/etc/profile是所有用户的环境变量。
/etc/enviroment是系统的环境变量。
登陆系统时shell读取的顺序应该是:/etc/profile->/etc/enviroment->$HOME/.profile->$HOME/.env
原因应该是用户环境和系统环境的区别了,如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。
4、说明:
~/.bash_profile是交互式login方式进入bash运行的。
~/.bashrc是交互式non-login方式进入bash运行的。
通常二者设置大致相同,所以通常前者会调用后者。
基本上以上的配置文件一个标准Linux的加载时所持有的,但是当安装了一些第三方软件或者美化工具时会加入一些特定的文件作为环境变量文件去设置这些第三方软件来达到目的,所以这里应该注意不要被这些文件扰乱了分析思路。
二、在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动/etc/profile文件,然后再启动用户目录下的~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个(根据不同的linux操作系统的不同,命名不一样),执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。
如果~/.bash_profile文件存在的话,一般还会执行~/.bashrc文件。
因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般还会有以下代码(有些系统没有这个,且不会调用/etc/bashrc):
if [ -f /etc/bashrc ] ; then
. /etc/bashrc
fi
所以,~/.bashrc会调用/etc/bashrc文件。最后,在退出shell时,还会执行~/.bash_logout文件。
执行顺序为:/etc/profile->(~/.bash_profile|~/.bash_login|~/.profile)->~/.bashrc->/etc/bashrc->~/.bash_logout
三、shell登录模式及其相应配置文件的关系
当启动shell时,它将运行启动文件来初始化自己。具体运行哪个文件取决于该shell是登陆shell还是非登陆shell的交互方式(比如通过bash),又或者是一个非交互式shell(用来执行shell脚本)。要执行启动文件中的命令,用户就必须具备读的权限,而一般的Linux发行版本都会把对应的命令放在一些启动文件中。
1、交互式登陆(login)shell
交互式登陆shell指的是当用户登录系统时所用的那个shell(可以默认指定,如bash --login)。登录shell将查找几个不同的启动文件来处理其中的命令,bash shell处理文件的顺序如下:
/etc/profile:shell首先执行/etc/profile中的命令。设置这个文件后,可以为系统内所有的bash用户建立默认的特征(不同版本的Linux在此文件放置的命令不尽相同)。
~/.bash_profile、~/.bash_login、~/.profile:然后shell依次查找这些文件,并执行它找到的第一个文件中的命令。可以将命令放在这些文件中,以重写/etc/profile文件中默认的设置。
~/.bash_logout:当用户注销时,bash执行文件~/.bash_logout中的命令,这个文件包含了退出会话时执行的清理命令,如:删除临时文件等。
2、交互式非登陆(non-login)shell
交互式非登陆shell指的是如果启动了一个bash shell而没有等录系统(如在CLI 提示符中键入bash),则启动了一个交互式非登录shell。交互式非登录shell并不执行前面提到的启动文件中的命令,然而交互式非登陆shell从登录shell继承了由这些启动文件设置的shell变量。
/etc/bashrc:尽管不是通过bash直接调用,但许多~/.bashrc文件调用/etc/bashrc。这种设置使得超级用户可以为系统内的非登陆shell建立默认属性。
~/.bashrc:交互式非登陆shell执行~/.bashrc文件中的命令,而登陆shell的启动文件(如~/.bash_profile)通常会运行这个文件。这样,登陆shell和非登陆shell都可以运行~/.bashrc中的命令了。
3、非交互式shell
非交互式shell指的是以shell script(脚本)方式运行(也就是.sh结尾的文件)。在这种模式在运行时shell并不与用户进行交互(除非在运行时需要用户指定运行参数),而是读取存放在文件中的命令并执行它们。当它读到文件的结尾,shell也就终止了。这些shell从登陆时就继承了由这些启动文件设置的shell变量。
BASH_ENV:非交互式shell查找环境变量BASH_ENV(或者当作为sh调用时为的ENV),并执行由该变量命名的文件中的命令。
4、测试:
在~/.bash_profile中设置如下变量:
lshell="login shell will see this message"
分别启动一个交互式non-login shell和交互式login shell,查看lshell变量:
$ bash
$ echo $lshell
$ exit
exit
$ bash --login
$ echo $lshell
login shell will see this message
$ exit
logout
可见non-login shell并没有读取~/.bash_profile,login shell读取了,与上面的描述相符。
参考:
http://baike.baidu.com/item/%E4%BA%A4%E4%BA%92%E5%BC%8F%E7%99%BB%E5%BD%95(交互登录方式)
http://www.cnblogs.com/zengkefu/p/5492532.html(交互登录方式)
http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580744.html(交互登录方式转自此篇文章)
http://blog.csdn.net/li19236/article/details/41486587(交互登录方式)
http://www.cnblogs.com/qcly/p/3273373.html(交互登录方式测试转自此篇文章)
https://help.ubuntu.com/community/EnvironmentVariables(Ubuntu环境变量设置)
http://www.cnblogs.com/liduanjun/p/3536993.html(配置文件说明转自此篇文章)
http://www.cnblogs.com/xiehongfeng100/p/4969477.html(配置文件说明)
http://blog.chinaunix.net/uid-354915-id-3568853.html(配置文件说明)
http://www.cnblogs.com/mengyan/archive/2012/09/04/2669894.html(配置文件说明)
http://www.linuxidc.com/Linux/2015-01/111459.htm(配置文件说明)
http://www.cnblogs.com/yymn/p/5698623.html(配置文件说明)
http://blog.sina.com.cn/s/blog_8795b0970101f1f9.html(配置文件说明)
Original url: Access
Created at: 2018-11-29 15:27:48
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论