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

来源:互联网 发布:张银奎 软件调试 编辑:程序博客网 时间:2024/05/27 16:41

什么是shell?
在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
简单来说,shell就是用于和用户进行交互的。
在排序算法中,Shell是希尔排序的名称。
[1]基本上shell分两大类:
一:图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的 Windows Explorer (微软的windows系列制作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manger (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。
二:命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
bash / sh / ksh / csh(Unix/linux 系统)
(MS-DOS系统)
cmd.exe/ 命令提示字符(Windows NT 系统)
Windows PowerShell(支援 .NET Framework 技术的 Windows NT 系统)
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
登陆、非登陆shell,交互、非交互shell,以及它们的startup文件

家目录下的配置文件.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, /etc/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就工作在非交互式模式下。

交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
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打印出来的。


父shell和子shell

在一个shell A 中启动另一个shell B,则 shell B为shell A的子shell。例如在桌面式 登录shell 中打开了另一个非登录shell B,则B为子shell; 在非桌面式登录shell 或者 非登录shell下 使用shell指令(例如 $bash ),则进入子shell,使用exit退出子shell。

  设置本地环境变量之后,如果不使用export,则只能在当前shell下使用该环境变量,如果使用export PAR_NAME="XXX",则可以在当前shell以及当前shell的子shell下使用该环境变量。