/etc/profile /etc/profile.d/* /etc/bashrc ~/.bash_profile ~/.bashrc
/etc/profile /etc/profile.d/* /etc/bashrc ~/.bash_profile ~/.bashrc 这些文件定义shell的运行环境,其运行有先后,不同情况执行不同的文件
先说shell的分类:
登陆或非登陆
我们可以直接使用shell(直接运行bash,或者其他shell),此为非登陆式.shopt [-p] login_shell,login_shell不能使用shopt命令进行设置
也可以输入用户名,密码后,由/usr/bin/login程序激活shell,此为登陆式.比如直接登陆tty终端,或者远程登入pts终端
交互或非交互
1)在shell中 - 是一个变量,表示当前shell一些环境,如果含有 i (interactive),则表示为交互式shell
终端上执行echo $-
脚本中执行
必须以新进程执行脚本,不能使用source方式,否则,显示的是当前shell的变量 - 的值
2)查看变量PS1或PS2,非空,则为非交互式,否则为交互式,非交互式无需这两个变量,其值为空
脚本中则为空
常见shell登陆方式
- 通过Linux伪终端或虚拟终端登录,此为交互式登录shell
- 在命令行中直接bash,此为交互式非登录shell,加入--login后变为交互式登录shell(执行环境是不同的,读取不同环境文件)
- 直接su不加--login为交互式,非登录shell
su --login切换用户为交互式,登录shell
- ssh root@zz1 'echo $-;shopt login_shell'为非交互式,非登录shell
- 桌面环境打开的终端为交互式,非登录shell
接下来说明login和no-login的shell在加载shell环境文件的不同
/etc/profile中插入 打印信息
上面图中代码正是/etc/profile.d/下的文件被读取的原因,bash默认只读取*.sh后缀名的文件和sh.local文件,sh.local一般为空
/etc/bashrc中也插入打印信息
在/etc/bashrc中if ! shopt -q login_shell定义了只有为非登录shell时,/etc/bashrc会读取/etc/profile.d/*.sh下的文件,但是不包括sh.local
~/.bash_profile
~/.bashrc
执行bash --login模拟登录shell
从图中可了解登录shell的文件加载过程
1) /etc/profile --------------> /etc/profile.d/*.sh /etc/profile.d/sh.local
2)$HOME/.bash_profile -------------> $HOME/.bashrc ---------------> /etc/bashrc
下面为non-login的shell加载过程
$HOME/.bashrc -----------> /etc/bashrc -------------> /etc/profile.d/*.sh 不包括 /etc/profile.d/sh.local
non-login的shell必须从login的shell生成,故会继承父shell的环境变量
$HOME/.bash_logout 为每次退出系统时执行
/etc/profile为系统的所有用户设置环境信息,等用户登录时,bash会执行此文件,此文件中还会加载/etc/profile.d/下的相关文件