环境变量是操作系统环境设置的变量,适用于整个系统的用户进程。
linux变量文件有/etc/environment
、 /etc/profile
、 ~/.profile
、 /etc/bash.bashrc
、 ~/.bashrc
, 以及~/.bash_profile
,~/.bash_logout
.
注意在每台机器中,这些配置文件并不是全都有,其中有些是必须的,有些是几个里面有一个,具体的介绍请往下看。
/etc/environment:是系统在登录时读取的第一个文件,该文件设置的是整个系统的环境,只要启动系统就会读取该文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入一行形如 PATH=$PATH:/xxx/bin的代码即可
/etc/profile:此文件是系统登录时执行的第二个文件。 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。(/etc/profile可以用于设定针对全系统所有用户的环境变量,环境变量周期是永久性)
/etc/bashrc:是针对所有用户的bash初始化文件,在此中设定的环境变量将应用于所有用户的shell中,此文件会在用户每次打开shell时执行一次。(即每次新开一个终端,都会执行/etc/bashrc)。
(这些文件处于主目录下)
~/.profile:对应当前登录用户的profile文件,用于定制当前用户的个人工作环境(变量是永久性),每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。(~/.bashrc只针对当前用户,变量的生命周期是永久的)
~/.bash_profile or ~/.bash_login or /.profile。**/.bash_profile是交互式login方式进入 bash 运行的,~/.bashrc 是交互式 non-login 方式进入 bash 运行的。通常二者设置大致相同,所以通常前者会调用后者。**每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。(如果~/目录下没有.bash_profile则新建立一个)
当一个shell关闭时,在bash_profile中定义的系统变量则会失效。因此,每打开一个新的shell时都要运行一次source bash_profile.而且针对当前用户。
~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 /.profile文件中的其中一个,用户主目录下文件的执行的顺序为:/.bash_profile -> ~/.bash_login -> ~/.profile。
如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。
因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.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
1)先将 export LANG=zh_CN加入/etc/profile,退出系统重新登录,登录提示显示英文。
2)先将 /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 (如果存在)
/etc/profile 是所有用户的环境变量
/etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是:
/etc/profile ->/etc/enviroment -->$HOME/.profile−−>$HOME/.env
原因应该是用户环境和系统环境的区别了,如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值,那应该是以用户环境为准了。
PATH是可执行文件的搜索路径,是我们最常接触到的,因为我们命令行中的每句能运行的命令,如ls
、top
、ps
等,都是系统通过PATH找到了这个命令执行文件的所在位置,再run这个命令(可执行文件)。
查看PATH环境变量,可以直接用echo $PATH
,输出的结果是以冒号分隔的;为了改善可读性,我们可以将冒号替换为换行符:echo $PATH | sed "s/:/\n/g"
。详见Linux中的awk、sed、grep及正则表达式详解中的例子。
这两个路径可以放在一起讨论,
两者的共同点是库,库是这两个路径和PATH路径的区别,PATH是可执行文件。
两者的差异点是使用时间不一样。一个是编译期,对应的是开发阶段,如gcc编译;一个是加载运行期,对应的是程序已交付的使用阶段。
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库,一方面,我们可以以此功能来使用自己的或是更好的函数(比如,你可以使用Google开发的tcmalloc来提升效率),而另一方面,我们也可以向别人的程序注入程序,从而达到特定的目的。
PS1环境变量用于改变终端的提示符。比如:
export PS1="$ "
注意以上也不是穷举列出了环境变量,而是除了上面最常用的几个之外,另外一些比较常用的。
$HOME
用户家目录$LOGNAME
当前用户的登录名$HOSTNAME
主机的名称$SHELL
用户在使用的Shell解释器名称$HISTSIZE
输出的历史命令记录条数$HISTFILESIZE
保存的历史命令记录条数PS2
附属提示符$MAIL
邮件保存路径$LANG
系统语言、语系名称$RANDOM
生成一个随机数字$EDITOR
用户默认的文本编辑器Linux也提供了修改和查看环境变量的命令!下面通过几个实例来说明:
echo
显示某个环境变量值 echo $PATH
export
设置一个新的环境变量 export HELLO=hello
,在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。要想在永久地修改环境变量,需要像上面一样在变量文件中export。
env
显示所有环境变量
set
显示本地定义(系统中已经存在)的shell变量以及设置shell变量的新变量值,如果未指定值,则该变量值将被设为NULL。
unset
清除环境变量 unset HELLO
readonly
设置只读环境变量 readonly HELLO
,如果使用了readonly命令的话,变量就不可以被修改或清除了。
直接在当前shell中执行:
export PS1="$ "
将环境变量修改的命令添加到配置文件中,这样每次新打开的shell也会时想要的环境变量配置了。
vim ~/.bashrc
export PS1="$ " # 将这一句添加到最后
Ref:
https://www.imooc.com/article/43747
http://blog.itpub.net/69979681/viewspace-2743590/
https://blog.csdn.net/u010533843/article/details/54986646