Linux环境变量设置中配置文件分析(/etc/profile,~/.bashrc等)(转) - EasonJim - 博客园

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

请先后发表评论
  • 最新评论
  • 总共0条评论