非计算机专业工程师之扫盲系列二:SHELL

[复制链接]
2621|4
 楼主| sxggj 发表于 2008-12-30 13:39 | 显示全部楼层 |阅读模式
shell:壳、命令解释器、引擎,以前老听人说,就是不太明白什么意思。。。。欢迎大侠醍醐灌顶。<br /><br />下面百度搜的:<br />介绍&nbsp;<br />你可以做许多事情而不必知道它们实际上如何运作。比如,你不必懂得发动机燃烧的物理原理就可以开汽车。缺乏电子知识也不会阻止&nbsp;<br />你用CD机听音乐。不知道什么是Shell和它的工作原理,你还是可以使用UNIX。但是,知道这些你可以更好地利用UNIX。&nbsp;<br />一个UNIX系统有三种具有代表性的Shell可用:Bourne&nbsp;<br />shell,Korn&nbsp;shell,C&nbsp;shells。它们会在11,12,13章讨论。在这一章中,你会学到:&nbsp;<br /><br />什么是Shell&nbsp;<br />Shell可以为你做什么&nbsp;<br />Shell和整个系统的关系&nbsp;<br /><br /><br />内核与Shell&nbsp;<br /><br /><br />坚果的壳保护其内部的核,同样一个UNIX&nbsp;<br />shell提供一个外设的保护层。当你启动一台基于UNIX的计算机时,UNIX的程序被调入计算机的内存里,直到你关机。这个程序叫做内&nbsp;<br />核(kernel),它执行许多底级和系统级的工作。内核有责任解释基本指令并将其送到处理器。内核也负责运行和调度进程,以及执行所&nbsp;<br />有的输入输出。内核是UNIX系统的心脏,内核有且只有一个。&nbsp;<br /><br />你也许对内核职责的关键性有点迷惑,而内核指令同样的复杂和高技术性。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操&nbsp;<br />作造成损害,在内核的周围建了一个外壳(shell)。用户向shell提出请求,shell解释并将请求传给内核。这一节剩下的部分解释这个外层&nbsp;<br />是如何建立的。&nbsp;<br /><br />一旦内核调入内存,他就准备执行用户的请求。然而,用户首先得连接登录,然后发出请求。不管怎样,用户登录,内核必须知道用户是&nbsp;<br />谁以及如何与他通话。为了做到这点,内核调用两个特殊的程序,getty和login.对应每个用户的登录点--通常称为一个tty--内核调用&nbsp;<br />getty程序。这个过程被称为spawning(spawn原意是产卵)。getty显示一个登录提示,接着不断地监视通话点等待用户名的输入。当&nbsp;<br />getty取得任何输入时,它便调用login程序。login建立用户的身份并验证他登录的权利。login程序检查password(密码)文件。如果用&nbsp;<br />户输入的密码不正确,控制将从登录点返回到getty。如果正确,login调用password文件里用户条目中所记录的程序并将控制交给它。这&nbsp;<br />个程序也许是一个字处理软件或者是电子表格程序,不过一般是被称为shell的程序。&nbsp;<br /><br />假设有四个用户已经登录进系统。这四个用户中,有两个正使用Bourne&nbsp;shell,一个使用Korn&nbsp;<br />shell,还有一个使用电子表格程序。每一个用户都得到一份shell的拷贝以服务它的请求,但是内核只有一个。使用shell不会阻碍用户使用&nbsp;<br />电子表格或别的程序,但那些程序是运行在活动的shell下的。shell是一个单一用户专用的程序,它在用户和UNIX内核之间提供了一个界&nbsp;<br />面。&nbsp;<br /><br />你不必一定要使用shell来存取UNIX。上面的例子中,有个用户使用电子表格取代了shell。当这个用户登录进来时,电子表格程序启动。&nbsp;<br />当它退出电子表格程序时,他也就退出了系统。当强调安全性或者希望将用户与任何UNIX的界面屏蔽开时,这个技术挺有用。缺点是用&nbsp;<br />户不能使用mail或其他UNIX的功能。&nbsp;<br /><br />因为login后可以执行任何程序--shell只是简单的一个程序--你就有可能编写自己的shell。事实上,三个独立开发的shell已经成为UNIX&nbsp;<br />标准的一部分。它们是:&nbsp;<br /><br /><br />Bourne&nbsp;shell,由Stephen&nbsp;Bourne开发&nbsp;<br />Korn&nbsp;shell,由David&nbsp;Korn开发&nbsp;<br />C&nbsp;shell,由Bill&nbsp;Joy开发&nbsp;<br /><br />shell的多样性使你可以选择最适合你或者你感到最亲近的界面。&nbsp;<br /><br /><br />shell的功能&nbsp;<br /><br /><br />不过你选择哪个标准的shell并没有多大关系,因为三个shell都有相同的目的:在UNIX下为用户提供一个界面。为了达到这个目标,三个&nbsp;<br />shell都提供了相同的基本功能:&nbsp;<br /><br /><br />命令行解释功能&nbsp;<br />启动程序&nbsp;<br />输入输出重定向&nbsp;<br />管道连接&nbsp;<br />文件名置换&nbsp;<br />变量维护&nbsp;<br />环境控制&nbsp;<br />shell编程&nbsp;<br /><br /><br />命令行解释&nbsp;<br /><br /><br />当你登录进来,启动一个交互式的shell时,你会看到一个shell提示,通常是$,%或者#符号的形式。当你在提示符下敲进一行字符后,&nbsp;<br />shell就试图解释它。shell提示符下的输入有时被称为一个命令行。命令行的基本格式是&nbsp;<br />command&nbsp;arguments&nbsp;<br />命令名&nbsp;参数(一个或多个))&nbsp;<br /><br />command(命令)是可执行的UNIX命令,程序,实用工具,或shell程序。arguments(参数)被传递给执行程序。大多数的UNIX实&nbsp;<br />用程序要求参数有以下的格式:&nbsp;<br />option&nbsp;filenames&nbsp;<br />选项&nbsp;文件名(一个或多个))&nbsp;<br /><br />举个例子,在命令行下有&nbsp;<br /><br />$&nbsp;ls&nbsp;-l&nbsp;<br />file1&nbsp;file2&nbsp;<br /><br />在这个命令行中有三个参数传递给ls,第一个是个选项,剩下的两个是文件名。shell为内核所做的事情之一是减少不需要的信息。对于计&nbsp;<br />算机,空白(whit-espace)是一类无用信息;因此,有必要知道shell在遇到空白时做了些什么。空白由空格,水平制表符和换行符组成。&nbsp;<br />考虑这个例子:&nbsp;<br /><br />$&nbsp;echo&nbsp;part&nbsp;A&nbsp;part&nbsp;B&nbsp;part&nbsp;C&nbsp;<br /><br />part&nbsp;A&nbsp;part&nbsp;B&nbsp;part&nbsp;C&nbsp;<br /><br />这儿将命令行解释为有六个参数的echo命令并删除了参数之间的空白。假设如果你正在打印报告头想保留空白,你就得用引号将数据括起&nbsp;<br />来就象下面所示:&nbsp;<br /><br />$echo&nbsp;part&nbsp;A&nbsp;part&nbsp;B&nbsp;part&nbsp;C&nbsp;<br /><br />part&nbsp;A&nbsp;part&nbsp;B&nbsp;part&nbsp;C&nbsp;<br /><br />单引号阻止shell检查引号里面。现在shell将这一行解释为带一个参数的echo命令,而这个参数正好是包含空白的字符串。&nbsp;<br /><br /> &nbsp;<br /><br />启动程序&nbsp;<br /><br /><br />当shell解释完命令行后,它就启动命令行中要求的程序。实际是内核执行这个程序。为了启动程序执行,shell在PATH环境变量指定的目录中搜索可执行文件。当它找到这个文件,就启动一个子shell来运行程序。你应该知道子shell不必影响它父亲的环境设置而建立和操纵自&nbsp;<br />己的环境。比如一个子shell可以改变它的工作目录,当它运行完后,其父shell的工作目录仍保持不变。&nbsp;<br /><br /> &nbsp;<br /><br />输入输出重定向&nbsp;<br /><br /><br />shell在执行程序前进行重定向。考虑下面两个例子,其中使用wc单词统计工具统计有五行的数据文件:&nbsp;<br /><br />$wc&nbsp;-l&nbsp;fivelines&nbsp;<br /><br />5&nbsp;fivelines&nbsp;<br /><br />$wc&nbsp;-l&nbsp;5&nbsp;<br /><br />这里有一点微小的差异。在第一个例子中,wc知道它应该出去寻找名为fivelines的文件并对其进行操作。因为wc知道文件名,所以它将其&nbsp;<br />显示给用户。在第二个例子中,wc仅看到数据而不知道这些数据从那里来,因为shell做了定位和重定向数据到wc的工作,也因此wc无法&nbsp;<br />显示文件名。&nbsp;<br /><br /> &nbsp;<br /><br />管道连接&nbsp;<br /><br />  管道是输入输出重定向的特例,它将一个命令的输出直接连到另一个命令的输入,因此管道也是在调用程序前建立的。考虑下面的命&nbsp;<br />令行:&nbsp;<br /><br />$who|wc&nbsp;-l&nbsp;<br /><br />5&nbsp;<br /><br />shell没将who的输出显示到屏幕上,而是定向到wc的输入。&nbsp;<br /><br /> &nbsp;<br /><br />文件名置换&nbsp;<br /><br /> &nbsp;<br /><br /><br />shell有责任进行文件名的替换。shell在执行程序前做替换。举个例子:&nbsp;<br /><br />$echo&nbsp;<br />*&nbsp;<br /><br />file1&nbsp;file2&nbsp;file3&nbsp;file3x&nbsp;file4&nbsp;<br /><br />这儿,星号被扩展为五个文件名,并被传递给echo作为五个参数。如果你想显示一个星号,你应该用引号将它括起来。&nbsp;<br /><br />   &nbsp;<br /><br />变量维护&nbsp;<br /><br />  &nbsp;<br /><br />shell有能力进行变量维护。变量是存储数据为将来所用的场所。用等号(=)可以给变量赋值。&nbsp;<br /><br />$LOOKUP=/usr/mydir&nbsp;<br /><br />在这里,shell建立一个LOOKUP变量,并将/usr/mydir赋给它。稍后,你可以在命令行上通过在变量名之前加$符号来使用变量值。考虑&nbsp;<br />这些例子:&nbsp;<br /><br />$echo&nbsp;$LOOKUP&nbsp;<br /><br />/usr/mydir&nbsp;<br /><br />$echo&nbsp;LOOKUP&nbsp;<br /><br />LOOKUP&nbsp;<br /><br />C-shell的用户应该注意:C-shell中的赋值不同于Bourne和Korn&nbsp;<br />shell。C-shell使用set命令进行赋值。&nbsp;<br /><br />$set&nbsp;LOOKUP&nbsp;=&nbsp;<br />/usr/mydir&nbsp;<br /><br />注意在等号两边要加空格。&nbsp;<br /><br /><br />就象文件名的置换一样,变量名的置换也是在调用程序前进行。第二个例子省略了$符号。因此,shell只是简单地将字符串传递给echo作参数。在变量替换中,变量的值取代了变量名。例如在:&nbsp;<br /><br />$ls&nbsp;$LOOKUP/filename&nbsp;<br /><br />用/usr/mydir/filename做参数调用ls。  &nbsp;<br /><br />环境控制&nbsp;<br /><br />当login程序调用你的shell时,shell对你的环境进行设置,其中包括你的home(家)目录,你使用的终端类型以及用来搜索可执行文件的路径。环境被存储在环境变量中。举个例子,要改变终端类型,你需要改变TERM变量中的值,就象下面所示的:&nbsp;<br /><br />$echo&nbsp;$TERM&nbsp;<br /><br />vt&nbsp;100&nbsp;<br /><br />$TERM=ansi&nbsp;<br /><br />$echo&nbsp;$TERM&nbsp;<br /><br />ansi&nbsp;<br /><br />注意在C-shell中,给环境变量赋值使用setenv命令。&nbsp;<br />%setenv&nbsp;TERM&nbsp;<br />vt100&nbsp;<br /><br />shell编程&nbsp;<br /><br />你已经看到shell可以用来解释命令行,维护变量,执行程序。另外shell还是一种编程语言。通过使用流程控制和条件判断来组合命令与变&nbsp;量赋值,你就拥有了一个有力的编程工具。使用shell作为一门编程语言,你可以使重复的任务自动化,写报告,甚至你可以建立和操纵自己的数据文件。
虫虫儿 发表于 2008-12-30 13:48 | 显示全部楼层
平常人 发表于 2008-12-30 14:42 | 显示全部楼层

SHELL就是你操作一个系统的操作界面

在不知道系统的内部细节时也能正确地使用它。
 楼主| sxggj 发表于 2008-12-30 15:10 | 显示全部楼层

如楼上所说,那不是跟API成一回事了?

  
平常人 发表于 2008-12-30 19:11 | 显示全部楼层

你可以按API理解,通常API是为编程序时用的

而SHELL是为操作人员用的,一个是为机器用的,一个是为人用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

1397

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部