当一个用户登陆到Linux系统时,系统会自动为这个用户加载profile类和bashrc类两类文件,当用户退出时又会加载logout类文件,这是一个固定的过程,我们可以通过修改这些文件来达到我们想要在登陆或退出时完成的动作。下面详细的介绍一下这些命令。

注意:只有超级用户root可以修改全局类的配置文件;普通用户只能修改其家目录中的个人配置文件

首先是profile类文件,这类文件为交互式登陆的shell进程实现功能初始化的配置文件,如:仅仅用户有效的配置文件:~/.bash_profile和对所有用户都生效的配置文件/etc/profile和/etc/profile.d/*.sh(保存了大量的命令(为了缓解profile文件过大)注意:在Redhat或Centos系列的操作系统中,通常情况下,如果一个配置文件内容很多,格式复杂,我们会将其切割成多个片段,将切割出来的片段统一的存放在“程序名称.d”目录中;在这样目录中所保存的片段文件,大多会以统一的文件后缀名来命名),作用为:

    1)用于定义用户的环境变量

    2)用于运行脚本或执行命令

第二个是bashrc类文件,这类为非交互式登陆的shell进程实现功能启动配置的配置文件,分别是全局:/etc/bashrc和用户个人:~/.bashrc。作用为:

1)用于定义本地变量

2)用于定义命令的别名

3)定义umask

第三个是logout类,这类为交互式登陆的shell进程提供终止及清理类功能的配置文件

以上三类文件我们可以在每一个用户的家目录中查看到,比如:

 ~]$ ls -a ./.bash*
./.bash_history  ./.bash_logout  ./.bash_profile  ./.bashrc

(第一个文件“ ./.bash_history”为历史记录的文件,暂时先跳过)

剩下的三个文件就是最开始提到的三类文件,它们分别包含着以下内容:

 ~]$ cat ./.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
 ~]$ cat ./.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
 ~]$ cat ./.bash_logout
# ~/.bash_logout

根据这些脚本文件中的内容我们可以发现./.bash_profile文件会去执行当前目录下的./.bashrc文件,而./.bashrc文件会去执行/etc/bashrc文件,由此我们可以得出结论,当我们在登陆系统之后会先执行自己的配置文件,然后再去执行系统的配置文件。如果在自己的脚本中有一些和系统配置相同的内容或变量就会被系统的配置文件重写。


在不同的登陆方式下会有不同的加载配置的方式,不同的登陆方式分别有以下两种:

1.交互式登陆的shell,比如:

  1)直接通过某个终端输入帐号和密码后登陆打开的shell进程

  2)使用su - USERNAME或su -l USERNAME执行切换登陆打开的shell进程

2.非交互式登陆的shell

  1)在图形界面下,通过菜单或右键菜单打开的终端的shell进程

  2)使用su USERNAME执行切换登陆打开的shell进程


交互式登陆的shell进程,会按照顺序加载下列配置文件

/etc/profile -> /etc/profile.d/*.sh(profile.d相当于就是profile) -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc

非交互式登陆的shell进程,会按照顺序加载下列配置文件

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh


所有在命令行中执行的命令的操作,只要没涉及到文件的修改的,一般都只是针对当前的shell声明周期有效;只要shell进程结束,所有设置均失效,比如声明一个变量,当我们重启当前shell之后这个变量的值就丢失了。所以配置文件的作用就是使得我们赖以生存的配置信息可以长期有效,只要不修改配置文件中的内容,每一次打开shell都会使曾经的配置生效。但是当我们使用一些修改文本的命令对这些已经加载的文件进行修改后,并不能及时生效,只有在重启之后或使用命令重新加载之后才能正常生效。可是有的时候并不能允许我们随意的重启,所以命令就称为了一个最重要的方式。让配置文件中新定义的配置能够立即生效的方式:

1.source命令,使用格式:

    source /PATH/TO/SOME_CONF_FILES(在当前的shell中运行脚本中的命令,比如脚本中有exit命令,那么如果source运行,那么会退出当前shell)

    . /PATH/TO/SOME_CONF_FILES

2.exec命令,使用格式:

exec /PATH/TO/SOME_CONF_FILES