1、 本科 毕业 设计 (论文 ) (二零 届) Linux Shell 的设计与实现 所在学院 专业班级 计算机科学与技术 学生姓名 学号 指导教师 职称 完成日期 年 月 I 摘要 :shell 是用户和 Linux 操作系统之间的接口。 shell 是一个命令语言解释器。无论何时用户输入一个命令都将由 Linux shell 解释。当用户登录一个 Unix系统时,用户可以访问事件日志文件来了解什么是 shell 及其工作原理。用户通常通过 Unix 机器上的终端端口(无论是一个老式的串行终端或例如 xterm 的终端仿真程序)来访问该机器的 Unix 系统。 本文在 UBUNTU 下编写的
2、shell 程序具有如下几个功能: 1. 程序执行: 用户在终端所有请求执行的程序都由 shell 负责。用户每次输入一行命令后,shell 分析它并决定如何执行。每一行命令都要遵循 shell 规定的基本格式:程序名 参数 2. 变量和文件名替换: 像其他任何的编程语 言一样, shell 允许我们指定变量的值。在 $符号前定义了变量的值, shell 则在命令行中用指定的值替换变量。 3. 标准输入 /输出和 I/O 重定向: 标准输入 /输出和 重定向是 shell 在命令行中的主要责任。当发生特别事件时它扫描命令行中的重定向字符 或 。 4. 管道: 正如 shell 扫描命令行中的重
3、定向字符,它也扫描管道字符 |。对于每一次找到这样的字符,它连接程序标准输出前面的 |和程序标准输入后面的“ |” 。 关键词: Linux; Shell; 标准输入输出; I/O 重定向;管道 II Design and Implementation of Linux Shell Abstract: The shell is a program used to interface between the user and the Linux kernel. The shell is a command line interpreter. Whenever we enter a command
4、 it is interpreted by the Linux shell. To understand what the shell is, and what it actually does,we review the sequence of events that happen when we log into a Unix system.We normally access a Unix system through a terminal (be it an old fashioned serial terminal, or a terminal emulator such as a
5、xterm window) connected to certain ports on the Unix machine. The shell has several responsibilities namely: 1. Program execution The shell is responsible for the execution of all programs that we request from our terminal. Each time we type in a line to the shell, the shell analyses the line and th
6、en determines what to do. As far as the shell is concerned, each line follows the same basic format: program-name arguments 2. Variable and File name substitution Like any other programming language, the shell allows us to assign values to variables. Whenever we specify one of these variables on the
7、 command line, preceded by an dollar sign, the shell substitues the value that was assigned to the variable at that point 3. Standard Input/Output and I/O redirection It is the shells responsibility to take care of input and output redirection on the command line. It scans the command line for the o
8、ccurrence of the special redirection characters or . 4. Pipes Just as the shell scans the command line for redirection characters, it also scans for the pipe character |. For each such character it finds, it connects the standard output from the program preceding the | to the standard input of the p
9、rogram following the |. Keywords: Linux; Shell; Standard Input/Output; I/O redirection; Pipes 目录 1. 引 言 . 1 1.1 Linux系统中 Shell的相关概念 . 1 1.2 Shell的历史 . 1 2. 开发环境与开发工具介绍 . 3 2.1开发环境 -Ubuntu . 3 2.2开发工具 GCC . 3 3. 基本功能和实现方法 . 4 3.1 shell程序形式 . 4 3.2 外部命令和内部命令 . 4 3.3 命令行 . 5 3.4 前台和后台作业 . 5 3.5 特殊键 . 5
10、 3.6 分析用户输入 . 5 3.6.1 分隔符和特殊字符 . 5 3.6.2 内部命令 . 6 3.6.3 I/O重定向 . 6 3.6.4 管道和协同程序 . 6 3.6.5 后台作业 . 6 3.6.6 语法 . 7 3.7 程序的实现 . 7 3.7.1 数据结构 . 7 3.7.2 程序结构 . 8 4. 主要源代码介绍 . 16 5. 结束语 . 22 参考文献 . 23 致谢 . 错误 !未定义书签。 1 1. 引 言 1.1 Linux 系统中 Shell 的相关概念 Linux 系统的 shell 作为操作系统的外壳,为用户提供使用操作系统的接口。它是命 令语言、命令解释程
11、序及程序设计语言的统 称 1。 shell 是用户和 Linux 内核之间的接口程序,如果把 Linux 内核想象成一个球体的中心, shell 就是围绕内核的外层。当从 shell 或 其他 程序向 Linux 传递命令时,内核会做出相应的反应。 实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此, Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。 Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编 写的 Shell程序与其他应用程序具有同样的效果 2。 管道是
12、 Linux 支持的最初 Unix IPC 形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程) ; 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在 于 内存中。一个进程向管道中写的内容被管道另一端的进程读出 , 写入的内容每次都添加在管道缓冲区的 末尾,并且每次都是从缓冲区的头部读出数据。 执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件( stdin)
13、,通常对应终端的键盘;标准输出文件( stdout)和标准错误输出文件( stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。输出重定向是指把命令(或可执行程序)的标准输出或 标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定 文件中 3。 1.2 Shell 的历史 标准的 UNIX shell 是 V7(AT&T 的第七版 )UNIX,在 19
14、79 年底被提出,且以它的创造者 Stephen Bourne 来命名。 Bourne shell 是以 Algol 这种语言为基础来设计,主要被用来做自动化系统管理工作。虽然 Bourne shell 以简单和速度而受欢迎,但它缺少许多交谈性使用的特色,例如历程、别名和工作控制。 C shell 是在加州大学柏克来分 校于 70 年代末期发展而成,而以 2BSD UNIX的部分发行。这个 shell 主要是由 Bill Joy 写成,提供了一些在标准 Bourne shell 所看不到的额外特色。 C shell 是以 C 程序语言作为基础,且它被用来当程序语言时,能共享类似的语法。它也提供
15、在交谈式运用上的改进,例如命令列2 历程、别名和工作控制。因为 C shell 是在大型机器上设计出来,且增加了一些额外功能,所以 C shell 有在小型机器上跑得较慢,即使在大型机器上跟 Bourne shell 比起来也显得缓慢。 有了 Bourne shell 和 C shell 之后, UNIX 使用者就有了选择,且争论那一个 shell 较好。 AT&T 的 David Korn 在 80 年代中期发明了 Korn shell,在 1986 年发行且在 1988 年成为正式的部分 SVR4 UNIX。 Korn shell 实际上是 Bourne shell 的超集,且不只可在 U
16、NIX 系统上执行,同时也可在 OS/2、 VMS、和 DOS 上执行。它提供了和 Bourne shell 向上兼容的能力,且增加了许多在 C shell 上受欢迎的特色 ,更增加了速度和效率。 Korn shell 已历经许多修正版,要找寻用户使用的是那一个版本可在 ksh 提示符号下按 Ctrl-v 键。 在大部份的 UNIX 系统 中 ,三种著名且广被支持的 shell 是 Bourne shell(AT&T shell,在 Linux 下是 BASH)、 C shell(Berkeley shell,在 Linux 下是TCSH)和 Korn shell(Bourne shell 的
17、超集 )。这三种 shell 在交 互 (interactive)模式下的表现相当类似,但作为命令文件语言时, 在语法和执行效率上就有些不同了。 Bourne shell 是标准的 UNIX shell,以前常被用来做为管理系统之用。大部份的系统管理命令文件,例如 rc start、 stop 与 shutdown 都是 Bourne shell 的命令,且在单 用户 模式 (single user mode)下以 root 登录 时它常被系统管理者使用。Bourne shell 是由 AT&T 发展的,以简洁、快速著名。 Bourne shell 提示符号的默认值是 $。 C shell 是
18、柏克莱大学 (Berkeley)所开发的 ,且加入了一些新特性,如命令列历程 (history)、别名 (alias)、内建算术、 文件 名完成 (filename completion)和 作业 控制 (job control)。对于常在交 互 模式下执行 shell 的使用者而言,他们较喜爱使用 C shell;但对于系统管理者而言,则较偏好以 Bourne shell 来做命令,因为 Bourne shell 命令比 C shell 命令来的简单及快速。 C shell 提示符号的默认值是 %。 Korn shell 是 Bourne shell 的超集 (superset),由 AT&
19、T 的 David Korn 所开发。它增加了一些特色,比 C shell 更为先进。 Korn shell 的特色包括了可编辑的历程、别名、函式、正规表达式万用字符 (regular expression wildcard)、内建算术、 作业 控制 (job control)、 协作 处理 (coprocessing)和特殊的 纠 错功能。 Bourne shell 几乎和 Korn shell 完全向上兼容 (upward compatible),所以在 Bourne shell 下开发的程序仍能在 Korn shell 上执行。 Korn shell 提示符号的默认值也是 $。在 Lin
20、ux 系统使用的 Korn shell 叫做 pdksh,它是指 Public Domain Korn Shell。 除了执行效率稍差外, Korn shell 在许多方面都比 Bourne shell 为佳;但是,若将 Korn shell 与 C shell 相比就很困难,因为二者在许多方面都各有所长,就效率和容易使用上看, Korn shell 是优于 C shell,相信许多使用者对于 C Shell 的执行效率都有负面的 印象 45。 在 shell 的语法方面, Korn shell 是比较接近一般程序语言,而且它具有子程序的功能及提供较多的资料型态。至于 Bourne shell
21、,它所拥有的资料型态是三种 shell 中最少的,仅提供字符串变量和布尔型态。在整体考量下 Korn shell 是三者中表现最佳者,其次为 C shell,最后才是 Bourne shell,但是在实际使用中仍有其它应列入考虑的因素,如速度是最重要的选择时,很可能应该采用 Bourne shell,因它是最基本的 shell,执行的速度最快。 3 2. 开发环境与开发工具介绍 2.1 开发环境 -Ubuntu Ubuntu 项目完全遵从开源软件开发的原则;并且鼓励人们使用、完善并传播开源软件。也就是 Ubuntu 目前是并将永远是免费的。 然而,这并不仅仅意味着零成本,自由软件的理念是人们应
22、该以所有“对社会有用”的方式自由地使用软件。“自由软件”并不只意味着您不需要为其支付费用,它也意味着您可以以自己想要的方式使用软件:任何人可以任意方式下载、修改、修正和使用组成自由软件的代码。因此,除去自由软件常以免费方式提供这一事实外,这种自由也有着技术上的优势:进 行程序开发时,就可以使用其他人的成果或以此为基础进行开发。对于非自由软件而言,这点就无法实现,进行程序开发时,人们总得白手起家 6。基于上述原因,自由软件的开发是迅捷、高效和激动人心的! 2.2 开发工具 GCC GNU C 编译器( GCC)是一个在 Unix 或 Linux 等系统上运行的功能强大的编译器,是最重要的软件开发
23、工具,是自由软件项目中极具代表性的项目。最初,GCC 被认为是 GNU C Compiler 的缩写。 GCC 编译后代的执行效率比一般的编译器效率要高 20%-30%67。 经过 10 多年的 发展, GCC 不仅支持 C 语言,还支持 Ada、 C+、 Java、 Objective C、 Pascal、 COBOL 等开发语言。目前,人们不再将 GCC 看成是一个纯粹的 C语言的编译器。 GCC 也变成 GNU Compiler Collection(即 GNU 编译器族)的缩写。 GCC 能够对几乎所有的硬件平台提供支持,并有极好的编译性能。 GCC 的编译过程分为预处理、生成汇编代码
24、、生成目标代码和链接成可执行文件等 4个步骤。使用 GCC 编译代码时,可以通过参数控制其编译过程,让其停止在上诉 4 个步骤之一。 由于 Unix 平台的高度可移 植性, GCC 基本上在各种常见的 Unix 平台上都能见到。尤其近些年来,伴随着 Linux 系统的迅速推广和流行,在其上运行的GCC 也愈发受到人们的青睐,它的不断完善和发展使许多商业编译器都相形见绌。 4 3. 基本功能和实现方法 3.1 shell 程序形式 shell 程序设计不包括对配置文件和命令行参数的支持。 shell 提供一个命令提示符,如 lee,表示接收用户的输入,每次执行完成后再打印下一个命令提示符 lee
25、。但用户没有输入时, shell 需要随时处于等待输入状态 ,同时在屏幕上显示一些必要的信息。 3.2 外部命令和内部 命令 在大多数情况下,用户输入的命令时执行存储在文件系统中的可执行程序,称之为外部命令或外部程序 8。 shell 应当支持在执行这些程序时可以将输入 /输出重新定向到一个文件,并允许若干个程序使用管道串联起来。本设计把管道连接起来的符合命令以及单独使用的命令统称为作业。 外部命令的形式是一系列分隔的字符串。第一个字符串是可执行程序的名字,其他的是传给这个外部程序的参数。如果第一个字符串所声明的可执行文件并不存在或者不可执行,则认为这个命令是错误的。 解释器支持一些内部命令,
26、这些命令在 shell 程序内部实现特定 的动作,下面是一些内部命令,如果用户提交了一个内部命令, shell 将按照下面的描述执行相应的动作。 1.exit:结束所有的子进程并退出 shell。 2.jobs:打印当前正在后台执行的作业和挂起的作业信息。输出信息应采用便于用户理解的格式。 jobs 自身是一条内部命令,所以不需要显示在输出上。 3.fg %:把 所标识的作业放到前台运行。如果这个作业原来已停止,那么让它继续运行。 Shell 在打印新的命令提示符之前等待前台运行的子进程结束。 4.bg %:在后台执行 标识的 已挂起的进程。 5.ls 列出目录中所有文件的名字,以及这些文件的
27、其他信息。 ls a 列出的内容包含以“ .”开头的文件 ls lu 显示最后访问时间 ls s 显示以块为单位的文件大小 ls t 输出时按时间排序 ls F 显示文件类型 6.cp 能够复制文件,典型的用法是 $ cp source-file target-file 如果 target-file 所指定的文件不存在, cp 就创建这个文件,如果已经存在就覆盖, target-file 的内容和 source-file 相同。 6.rm 用户可以用 rm 命令删除不需要的目录及文件。该命令的功能是删除一个目录中的一个或多个文件或目录,他也可以将某个目录及其下的所有文件及子目录均删除。对于链接
28、文件,只是断开了链接,源文件保持不变。 5 7.cat 显示或连结一般的 ascii 文本文件 cat text 显示 text 这个文件; cat file1 file2 依顺序显示 file1, file2 的内容; cat file1 file2file3 把 file1, file2 的内容结合起来,再 重定向( ) 到 file3 文件中。 3.3 命令行 当用户在提示符后面输入命令时,输入的整行内容叫做“命令行字符串”,shell 保存每一条命令行字符串,直到它表示的作业执行结束,其中包括后台作业和被挂起的作业。 shell 给每一个命令行字符串赋一个非负整数标识符。这个整数用来标
29、识存储作业的数据结构,作业的数据结构包含整个命令行字符串所表示的内容。一旦命令行字符串代表的作业执行结束, shell 就删掉表示这个作业的数据结构。标识符可以循环使用。 对于包含内部命令的命令行字 符串。不为它们建立作业的数据结构,因为它们本身的内容全部包含在 shell 程序中。 3.4 前台和后台作业 shell 能够执行前台和后台作业。 shell 在前台作业执行结束之前要一直等待。而在开始执行后台作业时立刻打印出提示符 lee,让用户输入下一条命令。 前台作业的执行总是优先于执行一个后台作业, shell 不需要在打印下一个提示符前等待后台作业的完成,无论是否有后台作业的执行,只要完
30、成一个前台作业,便立即输出提示符 lee。一个后台作业结束时, shell 在作业执行结束后立刻打印出一条提示信息。下面语法中会在命令语法 分析程序中介绍相应的语法来支持后台作业。 3.5 特殊键 又称组合键。通过终端驱动程序,特殊的组合键可以产生信号给 shell,程序对这些信号做出适当的响应。 Ctrl+Z:产生 SIGTSTP 信号,这个信号不是挂起 shell,而是让 shell 挂起在前台运行的作业,如果没有任何前台作业,则该特殊键无效。 Ctrl+C:产生 SIGINT 信号,这个信号不是中止 shell,而是通过 shell 发出信号杀死前台作业中的进程。如果没有任何前台作业,则
31、该特殊键无效。 3.6 分析用户输入 3.6.1 分隔符和特殊字符 分析用户输入的语法分析器具有下面介 绍的功能,它能够检查用户的输入错误。如果用户输入的某些地方出错了, shell 提供合理的出错信息。 shell 每次接受用户输入的一行命令,在用户按下回车键( Enter)后开始执行分析动作。空命令不能产生任何操作,而只是打印一个新提示符。 定义空格符为分隔符, shell 可以处理命令行中间和前后出现的重复空格符。 6 某些字符被称作“元字符”,它们在用户输入的上下文中具有特定的含义。这些字符包括“ &、 |、 ”。 shell 假设这些字符不会出现在程序名、参数名和文件名中,它们是 s
32、hell 的保留字符。 3.6.2 内部命令 如果命 令行字符串符合前面介绍的内部命令的格式,它就作为一个内部命令被解释。如果不是,就要考虑可能是外部程序的执行,或者是错误的。 3.6.3 I/O 重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。 一个程序命令后面可能还跟有元字符“ ”,它们是重定向符号,而在重定向符号后面还跟着一个文件名。在“ ”的情况下,程序的输出被重定向到
33、一个指定的文件中。如果输入文件不存在,则认为是出现了错误。 3.6.4 管道和协同程序 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于 父子 进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 数据的读出和写入:一个进程向管道中写的内容 被管道另一端的进程读出。写入的内容每次都添加在管道 缓冲区 的末尾,并且每次都是从缓冲区的头部读出数据。 在一条命令行中当若干个命令被元字符“ |”分隔开时,
34、这个元字符代表着管道符号。在这种情况下, shell 为每一个命令都创建一个进程,并把它们的输入 /输出用管道连接起来。例如下面这条命令行: progA argA1 argA2 outflie 应生成 progA 和 progB 两个进程, progA 的输入来自文件 inflie, progA的输出时 progB 的输入,并且 progB 的输出是文件 outfile。这种命令行可以通过进程间通信中的管道来实现。 含有一个和多个管道的命令会在如下几种情况下产生错误: 1 当其任何一个子程序执行出错时。 2 除了第一个子程序以外的其他子程序的输入被重定向。 3 除了最后一个子程序以外的其他子程序的输出被重定向。 由管道连接的多个进程所组成的作业只有当其所有的子进程都执行完毕后才算结束。 3.6.5 后台作业 当用户需要在后台执行一个作业时,可以在作业命令的后面加上元字符
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。