说明:在研究中发现,对于不同版本的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. VUE移动端禁止双手放大缩小

    //index.html <meta name="viewport" content="width=device-width,initial-scale=1.0,u ...

  2. 编译安装php、nginx

    以centos6.6为例 1.安装以及配置php 首先在官网下载源码包http://php.net/downloads.php 这里下载php-7.1.16 .tar.gzcd php-7.1.16 ...

  3. SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定 ...

  4. Angular——流程控制指令

    基本介绍 (1)ng-repeat,类似于for循环,对数组进行遍历 (2)ng-switch on,ng-switch-when,类似于switch,case 基本使用 ng-repeat < ...

  5. JS——sort

    1.a-b升序 <script> var arr = [2, 3, 1, 5, 0]; function compare(a, b) { return a - b; } console.l ...

  6. 【译】x86程序员手册11- 4.1系统寄存器

    4.1 Systems Registers 系统寄存器 The registers designed for use by systems programmers fall into these cl ...

  7. 在Mac安装Scheme

    我也不知道安装的是Scheme这门语言还是编程环境还是其他的什么东西,反正能在控制台运行Scheme代码了.... 谁能告诉我怎么在sublime使用scheme.... 原地址 首先下载安装MIT- ...

  8. #2028 Lowest Common Multiple Plus

    http://acm.hdu.edu.cn/showproblem.php?pid=2028 应该是比较简单的一道题啊...求输入的数的最小公倍数. 先用百度来的(老师教的已经不知道跑哪去了)辗转相除 ...

  9. Caffe2:添加CUDA路径

    在使用Eclipse时候,仍然出现 libcuda.so 找不到的情况..... 原因:cuda环境没有设置到系统环境中. 方案: 设置CUDA path: 在bashrc中添加路径,只对当前用户产生 ...

  10. 新人转型学习C#

    毕业3年,终于在4个多月前,下定决心辞职了.一直以来都想从事软件开发的工作,也觉得自己更加适合这方面的工作.自己如果这一次还是没能往这方面发展的话,感觉以后也不会有机会了. 于是,想着工作先不找了,买 ...