• Post author:
  • Post category:Linux小记

  要明白两个文件区别,我们首先先要了解下面几个概念:

    •  登录式shell:需要输入用户名和密码才能进入Shell的方式。
    •  非登录式shell:不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口。
//至于如何判断,可以使用echo $0
[root@cp ~]# echo $0
-bash                           //登录式shell返回的结果
[root@cp ~]# bash
[root@cp ~]# echo $0
bash                            //非登录式sehll返回的结果
[root@cp ~]# ps aux | grep bash
root      17356  0.0  0.1 116500  3128 pts/0    Ss   21:22   0:00 -bash
root      17379  0.0  0.1 116520  3172 pts/0    S    21:22   0:00 bash
[root@cp ~]# exit
exit
[root@cp ~]# ps aux | grep bash
root      17420  0.0  0.1 116500  3164 pts/0    Ss   21:29   0:00 -bash
    •  交互式shell:等待用户输入执行的命令,系统不断提示
    •  非交互式shell:不需要和系统交互,如shell脚本。

除了这两个文件,这类的文件还有其它3个,大致可以分为两类:
    • 个人配置文件:~/.bash_profile 、~/.bashrc。
    • 全局配置文件:/etc/profile、/etc/profile.d/*.sh、/etc/bashrc
profile类文件主要用来设定环境变量、登陆前运行的脚本和命令。
bashrc类文件,则是设定本地变量,定义命令别名。如果全局配置文件和个人配置文件产生冲突,以个人配置文件为主。

  我们测试一下这些文件的读取顺序。
  首先是登录式shell,至于顺序如下,假设设置了相同名字不同内容变量,则以最后一个读取的文件里配置为主。
  看了结果,有点疑惑前面不是说了以个人配置文件为主么,那为什么是/etc/bashrc内变量生效呢,这里我们可以看下~/.bashrc文件的内容,可以发现它是执行我们准备的内容,但是后面用了if判断/etc/bashrc文件是否存在,存在则执行/etc/bashrc文件。

Connecting to 10.0.0.110:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Tue Jul 21 21:29:09 2020 from 10.0.0.1
/etc/profile
/etc/profile.d/*.sh
~/bash_profile
~/.bashrc
/etc/bashrc
[root@cp ~]# echo $a
2
[root@cp ~]# cat ~/.bashrc 
# .bashrc
echo "~/.bashrc"
a=3
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

然后我们换个用户,同样顺序,只不过没有单独给此用户的个人配置文件设置测试,那我们给它设置下

[c:\~]$ ssh cp1@10.0.0.110

Connecting to 10.0.0.110:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Tue Jul 21 21:53:03 2020
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

设置好了再尝试退出登录,同样顺序。

[c:\~]$ 

Connecting to 10.0.0.110:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Tue Jul 21 22:54:21 2020 from 10.0.0.1
/etc/profile
/etc/profile.d/*.sh
~/bash.profile
~/.bashrc
/etc/bashrc

然后是非登录shell,读取文件顺序如下。

[root@cp ~]# bash
~/.bashrc
/etc/bashrc
/etc/profile.d/*.sh
[root@cp ~]# echo $a
5
[root@cp ~]# cat /etc/profile.d/test.sh 
echo "/etc/profile.d/*.sh"
a=5

[root@cp ~]# su cp1                //这也是非登录式shell,但su - cp1则是登录式shell
~/.bashrc
/etc/bashrc
/etc/profile.d/*.sh

小结:

  • 登录式 shell 执行顺序:/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc
  • 非登陆式 shell 执行顺序: ~/.bashrc -> /etc/bashrc -> /etc/profile.d/*.sh