login shell 和 non-login shell 的区别

介绍以前先思考一个问题:有时咱们经过su命令切换用户后,却发现并无进入该用户的shell环境。这是为何?linux

login shell:取得bash时须要完整的登陆流程。就是说经过输入帐号和密码登陆系统,此时取得的shell称为login shellshell

non-login shell:取得sbash接口的方法不须要重复登陆的举动。如以X Window登陆登陆linux后,再以X的图形界面启动终端机,此时那个终端机并无须要输入帐号和密 码,那个bash环境就是non-login shell。在本来的bash环境下再次执行bash命令,一样也没有输入帐号密码就进入新的bash环境(前一个bash的子进程),新的bash也是non-login shell。vim

那么,到底二者的区别在哪里?bash

login shell:此种方式登陆时,shell会从新读取/etc/profile和~/.bash_profile来应用新的环境变量。spa

non-login shell:此时shell不会读取/etc/profile和~/.bash_profile,而是读取~/.bashrc来应用新的环境变量。话说标题是区别与影响,影响的东西天然源于区别。回到文章开头的问题,su切换用户没有获取用户的环境(当时用的命令是"su xxoo",这里xxoo为要切换的用户,以root身份执行的此命令),看来问题就在这倆login方式,根据现象咱们能够判断 su xxoo执行了non-login shell。接口

为了验证上面的判断,咱们查看了su命令的简单帮助:进程

[root@isayme ~]# su --help
Usage: su [OPTION]... [-] [USER [ARG]...]
Change the effective user id and group id to that of USER.
 
-, -l, --login               make the shell a login shell
登录

很明显,个人判断是正确的,默认状况下是执行的non-login shell,由于要执行login shell须要在su后面添加参数"-"或"-l"或"--login"。因此要在su以后获取用户的环境变量,须要执行相似"su - xxoo"之类的命令。变量

另外还有三个提示:配置

PS1:bash在读取/etc/profile后会读取各帐户的我的配置文件,所读取的我的配置文件主要有三个:~ /.bash_profile,~/.bash_login,~/.profile。其实bash在读取的时候只会读取的上述三个文件的其中一个,而读取 的顺序则就是上面的顺序。也就是说bash会依次查找上述三个我的配置文件,且找到一个后,后续的文件便再也不读取。

PS2:当以non-login shell登陆时,若是但愿获取用户的环境变量,执行"source ~/.bash_profile"便可(.bash_profile根据状况也多是.bash_login或.profile),而其中source能够用小数点替换,即"source ~/.bash_profile"等价于". ~/.bash_profile"。source命令的解释能够自行搜索。

PS3:其实有的linux发行版的login shell也会读取.bashrc文件,如Fedora11中执行 "vim ~/.bash_profile"会发现 "if [ -f ~/.bashrc ]; then . ~/.bashrc fi"。这里就使用了PS2的提到的用小数点替换source特性,即在./bash_profile会读取执行.bashrc文件

相关文章
相关标签/搜索