您好,欢迎访问三七文档
Shell十三问作者:之網中人详细讨论在:=218853&postdays=0&postorder=asc&start=01)为何叫做shell?在介绍shell是甚么东西之前,不妨让我们重新检视使用者与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为操作系统(OperatingSystem)的软件来控管,事实上,我们每天所谈的linux,严格来说只是一个操作系统,我们称之为核心(kernel)。然而,从使用者的角度来说,使用者也没办法直接操作kernel,而是透过kernel的外壳程序,也就是所谓的shell,来与kernel沟通。这也正是kernel跟shell的形像命名关系。如图:图(FIXME)从技术角度来说,shell是一个使用者与系统的互动界面(interface),主要是让使用者透过命令行(commandline)来使用系统以完成工作。因此,shell的最简单的定义就是---命令解译器(CommandInterpreter):*将使用者的命令翻译给核心处理,*同时,将核心处理结果翻译给使用者。每次当我们完成系统登入(login),我们就取得一个互动模式的shell,也称为loginshell或primaryshell。若从行程(process)角度来说,我们在shell所下达的命令,均是shell所产生的子行程。这现像,我们暂可称之为fork。如果是执行脚本(shellscript)的话,脚本中的命令则是由另外一个非互动模式的子shell(subshell)来执行的。也就是primaryshell产生subshell的行程,subshell再产生script中所有命令的行程。(关于行程,我们日后有机会再补充。)这里,我们必须知道:kernel与shell是不同的两套软件,而且都是可以被替换的:*不同的操作系统使用不同的kernel,*而在同一个kernel之上,也可使用不同的shell。在linux的预设系统中,通常都可以找到好几种不同的shell,且通常会被列于如下档案里:/etc/shells不同的shell有着不同的功能,且也彼此各异、或说大同小异。常见的shell主要分为两大主流:sh:burneshell(sh)burneagainshell(bash)csh:cshell(csh)tcshell(tcsh)kornshell(ksh)(FIXME)大部份的Linux系统的预设shell都是bash,其原因大致如下两点:*自由软件*功能强大bash是gnuproject最成功的产品之一,自推出以来深受广大Unix用户喜爱,且也逐渐成为不少组织的系统标准。2)shellprompt(PS1)与CarriageReturn(CR)的关系?当你成功登录进一个文字界面之后,大部份情形下,你会在荧幕上看到一个不断闪烁的方块或底线(视不同版本而别),我们称之为*游标*(coursor)。游标的作用就是告诉你接下来你从键盘输入的按键所插入的位置,且每输如一键游标便向右边移动一个格子,若连续输入太多的话,则自动接在下一行输入。假如你刚完成登录还没输入任何按键之前,你所看到的游标所在位置的同一行的左边部份,我们称之为*提示符号*(prompt)。提示符号的格式或因不同系统版本而各有不同,在Linux上,只需留意最接近游标的一个可见的提示符号,通常是如下两者之一:$:给一般使用者帐号使用#:给root(管理员)帐号使用事实上,shellprompt的意思很简单:*是shell告诉使用者:您现在可以输入命令行了。我们可以说,使用者只有在得到shellprompt才能打命令行,而cursor是指示键盘在命令行所输入的位置,使用者每输入一个键,cursor就往后移动一格,直到碰到命令行读进CR(CarriageReturn,由Enter键产生)字符为止。CR的意思也很简单:*是使用者告诉shell:老兄你可以执行我的命令行了。严格来说:*所谓的命令行,就是在shellprompt与CR字符之间所输入的文字。(思考:为何我们这里坚持使用CR字符而不说Enter键呢?答案在后面的学习中揭晓。)不同的命令可接受的命令行格式或有不同,一般情况下,一个标准的命令行格式为如下所列:command-nameoptionsargument若从技术细节来看,shell会依据IFS(InternalFieldSeperator)将commandline所输入的文字给拆解为字段(word)。然后再针对特殊字符(meta)先作处理,最后再重组整行commandline。(注意:请务必理解上两句话的意思,我们日后的学习中会常回到这里思考。)其中的IFS是shell预设使用的字段分隔符,可以由一个及多个如下按键组成:*空格键(WhiteSpace)*表格键(Tab)*回车键(Enter)系统可接受的命令名称(command-name)可以从如下途径获得:*明确路径所指定的外部命令*命令别名(alias)*自定功能(function)*shell内建命令(built-in)*$PATH之下的外部命令每一个命令行均必需含用命令名称,这是不能缺少的。3)别人echo、你也echo,是问echo知多少?承接上一章所介绍的commandline,这里我们用echo这个命令加以进一步说明。温习---标准的commandline包含三个部件:*command_nameoptionargumentecho是一个非常简单、直接的Linux命令:*将argument送出至标准输出(STDOUT),通常就是在监视器(monitor)上输出。(注:stdout我们日后有机会再解说,或可先参考如下讨论:=191375)为了更好理解,不如先让我们先跑一下echo命令好了:代码:$echo$你会发现只有一个空白行,然后又回到shellprompt上了。这是因为echo在预设上,在显示完argument之后,还会送出一个换行符号(new-linecharactor)。但是上面的command并没任何的argument,那结果就只剩一个换行符号了...若你要取消这个换行符号,可利用echo的-noption:代码:$echo-n$不妨让我们回到commandline的概念上来讨论上例的echo命令好了:*commandline只有command_name(echo)及option(-n),并没有任何argument。要想看看echo的argument,那还不简单﹗接下来,你可试试如下的输入:代码:$echofirstlinefirstline$echo-nfirstlinefirstline$于上两个echo命令中,你会发现argument的部份显示在你的荧幕,而换行符号则视-noption的有无而别。很明显的,第二个echo由于换行符号被取消了,接下来的shellprompt就接在输出结果同一行了...^_^事实上,echo除了-noptions之外,常用选项还有:-e:启用反斜线控制字符的转换(参考下表)-E:关闭反斜线控制字符的转换(预设如此)-n:取消行末之换行符号(与-e选项下的\c字符同意)关于echo命令所支持的反斜线控制字符如下表:\a:ALERT/BELL(从系统喇叭送出铃声)\b:BACKSPACE,也就是向左删除键\c:取消行末之换行符号\E:ESCAPE,跳脱键\f:FORMFEED,换页字符\n:NEWLINE,换行字符\r:RETURN,回车键\t:TAB,表格跳位键\v:VERTICALTAB,垂直表格跳位键\n:ASCII八进位编码(以x开首为十六进制)\\:反斜线本身(表格资料来自O'Reilly出版社之LearningtheBashShell,2ndEd.)或许,我们可以透过实例来了解echo的选项及控制字符:例一:代码:$echo-ea\tb\tc\nd\te\tfabcdef上例运用\t来区隔abc还有def,及用\n将def换至下一行。例二:代码:$echo-e\141\011\142\011\143\012\144\011\145\011\146abcdef与例一的结果一样,只是使用ASCII八进位编码。例三:代码:$echo-e\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66abcdef与例二差不多,只是这次换用ASCII十六进制编码。例四:代码:$echo-nea\tb\tc\nd\te\bf\aabcdf$因为e字母后面是删除键(\b),因此输出结果就没有e了。在结束时听到一声铃向,那是\a的杰作﹗由于同时使用了-n选项,因此shellprompt紧接在第二行之后。若你不用-n的话,那你在\a后再加个\c,也是同样的效果。事实上,在日后的shell操作及shellscript设计上,echo命令是最常被使用的命令之一。比方说,用echo来检查变量值:代码:$A=B$echo$AB$echo$?0(注:关于变量概念,我们留到下两章才跟大家说明。)好了,更多的关于commandline的格式,以及echo命令的选项,就请您自行多加练习、运用了...4)(双引号)与''(单引号)差在哪?还是回到我们的commandline来吧...经过前面两章的学习,应该很清楚当你在shellprompt后面敲打键盘、直到按下Enter的时候,你输入的文字就是commandline了,然后shell才会以行程的方式执行你所交给它的命令。但是,你又可知道:你在commandline输入的每一个文字,对shell来说,是有类别之分的呢?简单而言(我不敢说这是精确的定议,注一),commandline的每一个charactor,分为如下两种:*literal:也就是普通纯文字,对shell来说没特殊功能。*meta:对shell来说,具有特定功能的特殊保留字符。(注一:关于bashshell在处理commandline时的顺序说明,请参考O'Reilly出版社之LearningtheBashShell,2ndEdition,第177-180页的说明,尤其是178页的流程图Figure7-1...)Literal没甚么好谈的,凡举abcd、123456这些文字都是literal...(easy?)但meta却常使我们困惑.....(confused?)事实上,前两章我们在commandline中已碰到两个机乎每次都会碰到的meta:*IFS:由space或tab或enter三者之一组成(我们常用space)。*CR:由enter产生。IFS是用来拆解commandline的每一个词(word)用的,因为shellcommandline是按词来处理的。而CR则是用来结束commandline用的,这也是为何我们敲enter命令就会跑的原因。除了IFS与CR,常用的meta还有:=:设定变量。$:作变量或运算替换(请不要与shellprompt搞混了)。:重导向stdout。:重导向stdin。|:命令管线。&:重导向filedescriptor,或将命令置于背境执行。():将其内的命令置于nestedsubshell执行,或用于运算或命令替换。{}:将其内的命令置于non-namedfunction中执行,或用在变量替换的界定范围。;:在前一个命令结束时,而忽略其返回值,继续执行下一个命令。&&:在前一个命令结束时,若返回值为true,继续执行下一个命令。||:在前一个命令结束时,若返回值为false,继续执行下一个命令。!:执行history列表中的命令....假如我们需要在commandline中
本文标题:shell十三问
链接地址:https://www.777doc.com/doc-4423385 .html