shell
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第781页(4803字)
从UNIX/XENIX整个系统构成来说,命令解释系统处在外层,相对于内核(kernel),命令解释系统就称为外壳(shell)。用户一旦注册进入系统,就与shell命令解释程序的主控程序sh进行通信。每引用一次解释程序就调用一个shell,而每一个shell都有一种基本功能:读入并执行来自终端上输入的命令。
shell是一个用C语言编写的一个普通命令解释程序,它并不是操作系统的法定部分,而是一个一般的用户程序。它向用户提供了一个高层的命令语言接口,而用户可利用该语言与操作系统相互通信。由于有了shell命令解释程序,命令可以:
①彼此结合起来以形成新的命令;
②传入位置参数;
③由用户增加或重新命名;
④循环或条件执行;
⑤创建为本地方式,以防与其它用户命令发生命名的冲突;
⑥后台执行,终端上的中断事件对它不起作用。
1.怎样建立shell
一个进程是具有指令,数据、输入和输出的完整的执行单位。所有的进程都有其固有的生命期,也可以启动或产生新的进程。在任何给定的某一时刻,可以有数个进程在执行,其中一些是另一些的子进程。当用户注册到系统中去,就被赋予一个shell,由此可以执行命令。
2.shell如何找命令
shell通常在文件系统的几个不同的位置上检索命令。shell先试图用给出的命令进行检索;如果这样不成功,就在该名字前放上/bin进行检索;如果这也不成功,就在该名字前放上/usr/bin进行检索。
3.标准输入/输出
标准输入/输出是由shell建立的,因此有可能由shell重新指定标准输入和标准输出。
4.shell变量
shell中的一个变量是表示一个字符串值的名称。
(1)位置参数 当一个shell过程被调用时,shell隐含地为它建立一系列的位置参数,在命令行的0位置的shell过程名本身被指定为位置参数$0,第一个命令参数称为$1,依此类推,每个命令参数都有相应的位置参数。
(2)用户定义的变量 shell可以识别以字符的组合来定义的变量,这些变量也可以用字符串给它们赋值。一个简单的赋值语句的语法格式为:
名称=字符串
在此以后,“$名称”将会引用值“字符串”。这里的名称是一个以字母或下划线开始的字母、数字和下划线序列。在赋值语句中的等号两边不应有空格。而且位置参数不能出现在赋值语句的左边。在一个赋值语句中,可以用多个赋值操作,但需要注意的是:shell按从右到左的顺序来执行赋值操作。任何对位置参数或其它变量名称作前置符($)的引用,则这些引用结果将由相应的字符串值来替代。但是单引号禁止变量替换。
下面的各变量是由shell维护和管理的,其中有些变量是由shell赋值的,但所有这些变量都可由用户重新设置。
HOME:由login程序将它初始化为用户的注册目录的名称。即在用户注册完成后成为其当前目录的那个目录。没有自变量的cd命令将当前目录切换到$HOME指定的目录。使用此变量有助于在shell过程之外保留全路径名。当路径名为了平衡盘负载情况或为反映系统管理上的变化而发生改变时,保留路径名就变得很有意义了。
IFS:此变量说明了哪些字符是“内部域分隔”。这些是在空格解释期间shell使用的字符。shell初始化设置的IFS变量的值,包括空格、制表符和换行符。
MAIL:存放邮件文件的路径名。如果MAIL已置值。则shell将在每次返回到系统命令级时检查此指定文件,看看是否有新的内容增加到文件中了。如果有,则命名新到达的邮件,并通知终端用户。MAIL不是由系统自动设置的,如果需要,则应在用户的profile文件中对MAIL加以设置,并完成选择性输出操作。注册时,如果标准邮件文件中有邮件,则系统将通知注册用户,而不管MAIL是否已经设置了。
MAILCHECK:此参数定义了shell间隔多长时间(以秒为单位)去检查由MAILPATH或MAIL参数定义的文件,看看是否收到了新的邮件。缺省值为600秒。如果设置为o,则shell在每次命令揭示前都进行一次检查。
MAILPATH:一个由分号分隔的文件名清单。如果这个参数由用户设置了,则在它说明的文件中任意文件里收到了新的邮件,shell都会通知用户。
SHACCT:如果此参数设置为一个用户可写的文件名,则shell将把每一个shell过程执行后的记帐记录写入到此文件中,系统中的一些记账过程可用来分析收集的数据。
SHELL:当shell被调用时,它将扫描系统为此变量名而建立的说明结构,若它找到了这一说明结构并且说明结构取值的文件名称部分有“r”字符,则此调用的shell将变为一个受限的shell。
PATH:PATH变量定义了shell在寻找命令时使用的查找路径,它的值是一个由冒号分隔的目录路径名序列。shell初始化PATH变量为序列“:/bin:/usr/bin”,在这里第一个冒号前有一个空串参数。在查找路径序列中的任意位置出现的空串都表示在当前目录。在有些系统中,对当前目录的查找并不属于缺省的赋值,则对PATH的初始化值应由序列“/bin:/usr/bin”来代替。如果希望最后查找当前目录,而不是首先查找,则使用:
PATH=bin:/usr/bin:
CDPATH:此变量定义了目录含arg的查找路径,可选的目录名用冒号(:)分开。缺省路径是<null>(<空串>),一个空串路径名指定了当前目录。空串路径名可出现在等号之后或在冒号定界符之间,以及此路径表中其它位置。如果命令的arg是以反斜线(/)开始的,则查找路径无效。否则系统将在此路径表规定的目录里,查找所需的arg。
PS1:此变量说明的字符用作系统中的基本提示字符串。若shell是交互使用的,则当shell在期望输入时,给出PS1的值作为提示。缺省的PSI的值是“$”。
PS2:此变量说明了shell的第二提示字符串。若shell在它的输入中收到了换行符时,仍期望更多的输入内容,则shell将给出PS2的值作为提示信息。PS2变元的缺省值是“>”。
(3)预定义的特殊变量 shell中有些变量有其特殊含义,下列各变量只有shell本身才可以设置。
$# 记录传递给shell的自变量个数,它的计值不包括shell过程本身在内。
$? 含有最后一条已执行命令的退出状态。它的值是一个十进制字符串。shell本身返回$?的当前值作为它的退出状态。
$$ 当前进程号。因为在所有已存在的进程中,进程号是唯一的,因此这一字符经常用于生成唯一的临时文件的文件名。
$! 最后一个在后台运行的(使用“&”)进程号。这是一个由1至5个数字组成的字符串。
$- 一个由当前执行状态的名称所组成的字符串,这些执行状态都是在shell中启动的,例如,若用户需要跟踪它的输出,则$-可能的值是“xv”。
(4)shell状态 可以使用各种不同的方法来改变一个shell所处的状态。
①改变当前工作目录 cd命令将当前工作目录转移到它的自变量指定的目录中去。
②·profile文件 每次用户注册进入系统时,系统都会从·profile文件中读取命令并执行。profile文件一般用于执行特殊的一次性执行的命令,为后来的所有shell设置并输出变量。
③执行状态标志 set命令允许用户通过设置某些shell的状态标志来改变shell的表现行为。尤其是,在终端上作为一条命令调用shell时,状态标志-x和-v是很有用的。状态标志-x和-v可以通过键入下面的命令来加以设置:
set-xv
同样可以键入下面的命令来关闭这些状态标志:
set+xv
这两个状态标志的含义如下:
-v当shell读入输入行时,将输入行在标准输出上输出。此状态标志对于检查语法错误尤其有用。系统显示出读入的输入行之后,才开始执行该输入行中的命令。
-x在执行命令时,打印出此命令以及此命令的自变量。注意,其区别是:-x使得系统只显示出那些真正执行了的命令序列,而-v显示出各个输入行。
set命令还可用于在shell过程中设置这些或其它的状态标志。
·C-shell
象标准shell一样,C-shell(csh)也是一个命令语言解释程序。由于这种shell具有许多和C语言相似的特点,所以我们称之为C-shell。C-shell也有一个用户和UNIX/XENIX命令及程序之间的接口,它能够把写在终端上的命令行翻译成相应的系统动作,给出存取信息如:用户登录名、主目录和邮箱,并且为使系统工作自动化,允许用户建立shell过程。当在标准shell提示符“$”下想进入Cshell,键入csh,然后按〈CR〉键。C-shell的提示符是“%”。