登录、非登录shell,交互、非交互shell,以及它们的startup文件

家目录下的配置文件.bashrc中rc的含义是resource configurationshell

什么是登录shell?什么是非登录shell?bash

登录shell是指:(1)用户登录时,输入用户名和密码后启动的shell;(2)经过带--login参数的命令:bash --login而启动的shell。对于用户来讲,登录shell和非登录shell的主要区别是:启动shell时所执行的startup文件不一样。我在/etc/profile、~/.bash_profile、~/.bashrc三个文件中分别经过echo命令打印出文件名。执行命令以下所示:ide

wangjk@wangjiankun:~$ bash
.bashrc
wangjk@wangjiankun:~$ bash --login
etc/profile
.bash_profile
.bashrc
wangjk@wangjiankun:~$this

上面的结果说明:登录shell执行startup文件为:/etc/profile、~/.bash_profile、~/.bashrc(这里只是从现象上得出的推论,这种推论是有问题的,稍后讨论),而非登录shell执行的startup文件仅为:~/.bashrc。get

bash做为登录shell是由/etc/login程序解析/etc/passwd文件而指定的,例如:wangjk:x:1000:1000:wangjiankun,,,:/home/wangjk:/bin/bash,其中红色域指定了用户的登陆shell是bash。it

事实上,bash做为登录shell启动时执行的startup文件以下:io

  • /etc/profile
  • ~/.bash_profile,~/.bash_login or ~/.profile, first existing readable file is read

而bash做为非登录shell启动时读取~/.bashrc。注意,做为登录shell时bash并不读取~/.bashrc,可是在文件~/.bash_profile中一般都有以下语句来读取~/.bashrc:class

if [ –f  ~/.bashrc ]; then . ~/.bashrc; fitest

以上讨论的是交互式bash shell,其实shell有两种工做模式,就是:交互式和非交互式,执行脚本时,shell就工做在非交互式模式下。在非交互模式下,bash读取的startup文件由环境变量BASH_ENV来决定,例如,我在~/.test文件中用echo命令打印语句:I test non-interactive shell,在test.sh脚本中打印语句:this file is test.sh,运行输出结果以下:登录

wangjk@wangjiankun:~$
wangjk@wangjiankun:~$ echo $BASH_ENV

wangjk@wangjiankun:~$ ./test.sh                                            
this file is test.sh
wangjk@wangjiankun:~$ export BASH_ENV=~/.test
wangjk@wangjiankun:~$ ./test.sh                                            
I test non-interactive shell
this file is test.sh
wangjk@wangjiankun:~$

注意,中间的那个空行表示环境变量BASH_ENV为空,因此第一次运行脚本test.sh时只输出了一句话,在定义了环境变量BASH_ENV为~/.test之后运行脚本test.sh就打印了两句话其中第一句是运行文件~/.test打印出来的。

相关文章
相关标签/搜索