每个用户都有自己专属的运行环境,这个环境是由一组变量所定义,这些变量称之为环境变量。用户可以修改环境变量以满足自己的要求。
设置环境变量:$export NAME="HELLOWORLD" ( 临时变量,重启系统将失效)
显示环境变量:$echo $NAME
env 命令查看当前用户的环境变量
如果要想把环境保存于系统,以便下次开机还能生效就必须配置到以下文件中:
/etc/profile;~/ .bash_profile;~/ .bash_login;~/.profile;~/ .bash_logout;
/etc/bash.bashrc;~/.bashrc;
那么他们之间有什么样的区别呢?
首先理解一下概念:
login shell:用户通过终端登录凭借用户名和密码登录控制台的动作是login shell,也就是说最终会调用login命令的操作都可称之为login shell。
non-login shell:用户在图形界面启动一个terminal,或者执行/bin/bash,/usr/bin/bash都属于non-login shell。
用户登录时,会读取login shell。读取文件的顺序是:
- /etc/profile
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
即: /etc/profile 是必须要执行的,然后后面3个,按照顺序谁存在就执行谁,然后后面的就不会再执行。其逻辑可用代码表示为:
- execute /etc/profile
- IF ~/.bash_profile exists THEN
- execute ~/.bash_profile
- ELSE
- IF ~/.bash_login exist THEN
- execute ~/.bash_login
- ELSE
- IF ~/.profile exist THEN
- execute ~/.profile
- END IF
- END IF
- END IF
注意:1. /etc/profile 是全局配置,任意一个用户登录的时候都会载入该配置文件内容,而~开头的几个配置文件只是在相应用户登录的时候才会载入
2. 上面几个文件只会在用户登录的时候载入一次,在用户重新登录之前,即使配置文件被修改了,也不会在自动刷新
退出交互控制台,会执行~/.bash_logout :
- IF ~/.bash_logout exists THEN
- execute ~/.bash_logout
- END IF
对于 /etc/bash.bashrc 和~/.bashrc,是在non login shell 启动时执行,也就意味着在图形界面每开启一次terminal,就会读取一次该文件。
/etc/bash.bashrc是每个用户都有效的,而~/.bashrc是只对对应用户有效。
- IF ~/.bashrc exists THEN
- execute ~/.bashrc
- END IF
在很多Redhad发行版中和Ubuntu发行版中,如果.bashrc存在于home目录,它将从.bash_profile或.profile中运行。即执行.bash_profile或.profile配置时会同时执行.bashrc配置文件内容。
下面是.bash_profile或.profile中有的代码
# Run .bashrc if it exists
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
总的来说,配置文件分两种:1. login shell 在登录时即生效
2. non login shell 在每次打开终端时都会生效
同时 login shell 又分为登录时和退出时两种情况。
注意: 1. /etc/environment是整个系统的环境,而/etc/profile是所有用户的环境,前者启动系统后就会去读取该文件,后者只有在用户登录的时候才去读取
2. 当用户修改配置文件之后,系统不会自动更新,因此用户可以采用source指令 或 .指令(“点”指令)来手动刷新,操作方法为:
source 你要刷新的文件路径 或 . 你要刷新的文件路径
但是,在终端执行该指令时,只会对当前终端有效,对于其他所有终端无效。
因此,修改profile类配置文件,如/etc/profile、~/.profile之后,最有效的办法还是用户退出再登录。
而bashrc类配置文件由于跪在每次重开终端时就游戏,所以修改配置后关闭终端再重开即可。
本人现在是有/etc/profile;~/.profile;~/ .bash_logout;
/etc/bash.bashrc;~/.bashrc;
因为比较好记忆,两个profile,两个bashrc,一个bash_logout