说明:在研究中发现,对于不同版本的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(配置文件说明)

Linux环境变量设置中配置文件分析(/etc/profile,~/.bashrc等)(转)的更多相关文章

  1. linux环境变量设置错误后的恢复方法(转)

    原文: http://blog.csdn.net/hoholook/article/details/2793447 linux环境变量设置错误后的恢复方法 中国自学编程网收集整理  发布日期:2008 ...

  2. 转:Linux环境变量设置方法总结 PATH、LD_LIBRARY_PATH

    转:  https://www.linuxidc.com/Linux/2017-03/142338.htm 文章写比较全  转载记录 Linux环境变量设置方法总结 PATH.LD_LIBRARY_P ...

  3. [转帖]Linux环境变量设置方法总结 PATH、LD_LIBRARY_PATH

    Linux环境变量设置方法总结 PATH.LD_LIBRARY_PATH 2018年01月17日 21:10:26 晨至曦 阅读数 7548 https://blog.csdn.net/qq_1900 ...

  4. linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH) http://blog.csdn.net/wangeen/article/details/8159500 设置 Linux ...

  5. Linux 环境变量设置的几种方法

    From:http://home.eeworld.com.cn/home.php?mod=space&uid=291513&do=blog&id=40557 环境变量是和She ...

  6. Linux下环境变量设置技巧,不用/etc/profile而是在/etc/profile.d目录下新建特定的shell文件来设置

    区别: 1.两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效,同样是永久变量,是全局变量. 2./etc/prof ...

  7. 【转】linux环境变量设置

    1. 显示环境变量HOME $ echo $HOME /home/terry 2. 设置一个新的环境变量WELCOME $ export WELCOME="Hello!" $ ec ...

  8. linux环境变量设置和默认执行语句设置

    环境变量设置 1.export export ORACLE_HOME=/usr/local/instantclient_12_2export PATH=$ORACLE_HOME:$PATHexport ...

  9. Linux 环境变量 设置 etc profile

    一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二. ...

随机推荐

  1. http通讯基础

    1 . 一个网页包括 JS  CSS Html 2 . 状态码:200  正常   302  临时重定向 (类似呼叫转移) 304  未修改,客户端缓存的信息是最新的,无需到服务器重新获取 403  ...

  2. keystone身份认证服务

    Keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等.云 ...

  3. flask中内置的session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  4. 点击文字弹出一个DIV层窗口代码 【或FORM表单 并且获取点击按钮的ID值】

    点击不同按钮咨询不同的 专家 <?php for($i=1;$i<5;$i++){ $uid=$i; //用户ID ?> <a class="a_click" ...

  5. 【Leetcode】474. Ones and Zeroes

    Today, Leet weekly contest was hold on time. However, i was late about 15 minutes for checking out o ...

  6. fastjson读取json配置文件

    fastjson读取json配置文件: ClassLoader loader=FileUtil.class.getClassLoader(); InputStream stream=loader.ge ...

  7. 笨拙而诡异的 Oracle(之二)

    有一张表,很多数据:   想取某个月的数据.初始的想法很简单,根据日期(RQ)形成条件即可:  符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 O ...

  8. Java——Spring介绍

    spring 是一个开源框架,是为了解决企业应用程序开发. 功能如下:1.目的:解决企业应用开发的复杂性.2.功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能.3.范围:任何Ja ...

  9. JS高级——作用域链

    基本概念 1.只要是函数就可以创造作用域 2.函数中又可以再创建函数 3.函数内部的作用域可以访问函数外部的作用域 4.如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链 <scr ...

  10. 关于react框架的一些细节问题的思考

    目录 setState到底是同步的还是异步的? 如何在子组件中改变父组件的state? context的运用,避免“props传递地狱” 组件类里有私有变量a,它到底改放在this.a中还是this. ...