要明白两个文件区别,我们首先先要了解下面几个概念:
• 登录式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