关于登陆shell和非登陆shell的区别

来源:互联网 发布:mssql sql语句监控 编辑:程序博客网 时间:2024/06/18 01:01

问题描述:

      实验室有一台用于Linux教学用的机器,为每一个学生在上面建了一个用户,作为上课用的。而我呢,正在做VLSI实验。因为那台机器持久开着,所以我为了方便就在上面也建了一个用户,用于VLSI实验。

      Cadence环境是在csh下的。但是管理员给我建的用户默认的是bash环境,我又没有超级用户密码,也不想麻烦管理员。于是我就想了个办法。修改.bashrc文件增加一行/bin/csh。让自启动一个csh,就可以啦。

问题解决:

      刚才把问题搞明白啦,原来我在.bashrc文件中还加上了这么一句export SHELL=/bin/csh。这样的话我图形界面登陆后,系统的shell环境变量就已经被设置成啦/bin/csh,因此你启动一个终端shell时都会默认进入csh环境。怪不得ps出来只有csh呢。这样我吧export SHELL=/bin/csh。再重新登陆到图形界面,打开一个终端shell,ps就会显示出bash建立了csh。

 

问题描述:

     还遇到一个问题。csh没有命令自动补齐,只要环境设置好,我就可以回到bash下啦。于是我就想在.cshrc文件中加入一行exit。但是好像并不执行exit。这是为什么呢?没有找到问题的答案。

 

通过解决这些问题,顺便了解一下登陆shell和非登陆shell的区别【摘】

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

什么是登陆shell?什么是非登陆shell?

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

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

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

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

事实上,bash作为登陆shell启动时执行的startup文件如下:

/etc/profile 
~/.bash_profile,~/.bash_login or ~/.profile, first existing readable file is read 
而bash作为非登陆shell启动时读取~/.bashrc。注意,作为登陆shell时bash并不读取~/.bashrc,但是在文件~/.bash_profile中通常都有如下语句来读取~/.bashrc:

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

以上讨论的是交互式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打印出来的。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiankun_wang/archive/2009/07/02/4317407.aspx