shell基础-环境变量配置文件de作用(图文超级详细)
前言
在用户登录的时候,这五个环境变量配置文件,它都会生效,他们之间有没有先后顺序,是否有优先级,在这些文件当中到底定义了哪些环境变量,请看下面详细 分析。
1.系统当中的环境变量配置文件
-
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
(1)/etc/profile
的作用
USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask
调用/etc/profile.d/*.sh文件
(2) ~/.bash_profile
的作用
调用了~/.bashrc文件
在PATH变量后面加入了":$HOME/bin"这个目录
(3) ~/.bashrc的作用
定义默认别名
调用/etc/bashrc
(4) /etc/bashrc
的作用
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
提示:/etc/下的配置文件是对任何用户登录都会生效。相当于校规。
另外两个,相当于班规。写在哪个家目录下的就对哪个用户生效。
注释: ~ 代表家目录,*代表通配符
2.配置文件流程图
原始图:
- 环境变量配置文件当中,他们之间是优先级的,谁先会读取,谁先会接下来读取,谁会最后读取。用户登录的时候首先读取的,就是/etc/profile文件,通过这个文件,分了两组,一组调用家目录下的.bash_profile文件,另外一组是调用了/etc/profile.d*sh文件。(如下图所示) 这些文件当中,写的任何一个跟用户登录相关的一个环境变量的配置,都会在登录的时候生效,这些文件在登录的时候就会读取,只要在这里写入想要的环境变量,给他设个值保存就可以永久生效了。
- 比如说环境变量path,为什么在每次登录的时候PATH都会有值那???都会有一个固定查找命令的路径那???那是因为PATH的值,在这一系列文件中都已经进行了定义。所以用户只要一登录,读取这个文件中的PATH变量,就会得到它里面的值,然后当他达到提示符之前,就会给PATH赋值。 所以每个用户登录,只要拿到提示符都会有它自己的PATH变量,定义的这样的路径
那path变量当中为什么会有这样的值那,是因为把path变量的定义,事先写在了这些配置文件当中,用户一旦登录就会从这些文件当中读取这个变量,或者其他变量的定义方式给他赋值,当用户达到命令提示符,这些变量都已经有默认值了。 -
这个环境变量默认赋值的时候,分两种情况。
第一种情况: 用户登录的情况,就是需要输入用户名和密码。
第二种情况: 没有登录的,就是没有输入用户名密码的过程。比如bash切换一个子shell,这种情况下切换是没有登录
一个输用户名密码,另一个不输用户名密码,读取的文件是不一样的
3.读取配置文件的第一种情况
开始分析:
-
(1) 输入完用户名密码,到达命令提示符之前,先读取/etc/profile这个文件。
vim /etc/profile
打开这个文件分析一下。
然后再调用/etc/profile/*.sh文件。怎么调用的那??? -
(2) 用户登录,先读取这个/etc/profile文件当中所有的默认的环境变量配置。读完之后就读取/etc/profile.d/*.sh文件。下面的文件全部都会被调用。
最主要的是调用lang.sh这个文件,定义系统语言的脚本。vim /etc/profile.d/lang.sh
打开这个文件看一下。 -
(3) 因为/etc/profile.d/lang.h文件调用了/etc/sysconfig/i18vim这个文件,vim /etc/sysconfig/i18n 所以打开这个文件看一下
-
(4) 这一组调用完之后,/etc/profile会把他的调用传递给下一个环境变量配置文件,也就是~(家目录下)/.bash_profile。我当前所在的用户是root。
vim /root/.bash_profile
打开这个文件。
小提示: 如果想把某一个目录作为一个系统默认搜索命令的路径,而且让他永久生效,就可以写在/root/.bash_profile配置文件当中PATH=$PATH:$HOME/bin的后面,用冒号分隔开就行。 -
(5) 然后调用下一个~(当前的家目录,我所在的是/root)/.bashrc这个环境变量配置文件。
vim /root/.bashrc
打开这个文件看一下
备注: 如果不想让别名放在这个文件当中,能放在其他的环境变量配置文件当中吗??? 没可以的,只要想让这个用户登录的同时,让这个别名生效,就可以放在这些环境变量当中的任意一个。注意:(1)有一个又登录过程的,一个是没有登录过程的(/etc/bashrc)(2)写在后面的会覆盖前面的,除非用变量叠加。横着一系列,越后面读取的文件,你定义的值它的优先级越高。举个栗子,aa=11 aa=22 echo $aa 会显示22.因为是后给他的赋值会覆盖前面给的值。
比如:PATH不是直接覆盖的,而是用的变量的叠加,再原始变量的后面加入新值。 并没又覆盖它的原始值。如果没有用变量叠加,后定义的变量,就会覆盖前面的内容。(3)~/.bash_profile
~/.bashrc
这两个只对当前用户生效。如果把别名写在/etc/profile这个文件当中就会所有登录用户生效。 -
(6) 然后再调用/etc/bashrc这个文件,打开这个文件。
注意事项:再前面/etc/profile文件中定义了PATH、umask,再最后的/etc/bashrc
这个文件当中,又把这些事干了。 而且又重新调用了/etc/profile/*.sh
这个文件。那这两个文件定义的值重复了吗???并没有重复,仔细看文件会发现一句话We’re not a login shell
登录分两种情况,一种是输入用户名密码(会调用这个文件的一部分内容比如PS1)
另一种是不输入用户名密码,直接就切换。
4.读取配置文件的第二种情况
- 再/etc/bashrc文件中读取一个没有登录shell的情况的时候的环境变量。然后再调用其他文件。最后显示命令提示符。
5. 总结
(1)要知道环境配置文件的作用是什么,能读懂文件里的内容。
(2)一个输用户名密码,另一个不输用户名密码,分两种情况,读取的文件是不一样的
(3)要知道这两情况的相互关系,以及他们读取文件的顺序。