1、 本科 毕业 设计 (论文 ) (二零 届) Linux Shell 的 研 究 与 开 发 所在学院 专业班级 计算机科学与技术 学生姓名 学号 指导教师 职称 完成日期 年 月 - 2 - 摘要: 介绍了在 Linux系统背景下对 Shell相关知识的了解,编写简单的shell 命令例如 ls,cp,cat 和 rm 命令等并且介绍了 Shell 相关的外部程序命令及管道和输入输出重定向功能,以加深对 Shell 这方面知识的理解,为此类程序的开发提供一定的启示性和指导性。熟悉 Linux 操作系统下的 C语言高级编程,了解 Linux操作系统的 shell执行方式,熟练运用 C语言对字符
2、串进行处理。学习并掌握 Linux C语言系统库函数的用法,熟练运用某些库函数来完成设计。 在 Linux 系统中, Shell 是最常使用的程序,其主要作用是侦听用户指令,启动指令所指定的进程并将结果返回给用户。 Linux 系统中的 shell,除了可作为命令编译 器之外,它也是一种不错的编程语言,是系统管理维护时的重要工具。 关键词 : linux; shell命令;管道;输入输出重定向 - 3 - Research and development of Linux shell Abstract: Linux systems are introduced in the context o
3、f knowledge about Shell, write a simple shell command such as ls, cp, cat, and rmcommands and introduced the Shell commands and external programs related to pipeline and input and output redirection. in order to deepen Shell knowledge and understanding in this area for the development of such proced
4、ures provide some inspiration and guidance. Familiar with the Linux operating system under the C high-level programming language,understand the Linux operating system, shell execution, skilled use of C language forstring processing. Learn and master the Linux C library function system, the usage of
5、language, skilled use of some library functions to complete the design. In the Linux system, Shell is the most frequently used programs, and its main role is to listen for user commands, start the process specified command and returns the results to the user. Linux system shell, in addition to the c
6、ompiler as a command other than that it is also a good programming language is important when the system management and maintenance tools. Keywords: Linux;shell command;pipeline; input and output redirection - 4 - 目录 1 绪论 . 1 1.1 课题的研究背景 . 1 1.1.1 shell简介 . 1 1.1.2 shell 的发展过程 . 1 1.2 课题研究的目的与意义 . 3
7、 1.3 课题的研究内容 . 3 2 linux下 shell 的开发方法 . 6 2.1 c语言简介 . 6 2.2 c 语言的结构特点: . 6 2.3 c 语言的优点 . 6 2.4 c语言缺点 . 7 2.5 shell概念 . 8 2.6 shell语言 . 9 3 开发工具和开发环境介绍 . 12 3.1 gcc 简介 . 12 3.2 gcc的基本用法和选项 . 13 4 基本功能和实现方法 . 17 5 主要源代码介绍 . 18 5.1 ls功能 . 18 5.2 cp功能 . 22 5.3 who 功能 . 23 5.4 cat 功能 . 25 5.5 r m 功能 . 27
8、 5.6 全部功能集合 my_cmd . 30 6 总结及展望 . 41 致 谢 . 错误 !未定义书签。 参考文献 . 41 1 1 绪论 1.1 课题的研究背景 1.1.1 shell 简介 Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/Linux 操作系统之核心程序( kernel)间的一个接口。 为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳 (shell)。用户向 shell提出请求, shell解释并将请求传给内核。 使 用 较 广 的 shell 有 标 准 的 Bourne shell (sh) 、 Korn Sh
9、ell(ksh) 、C shell (csh)、 Bourne Again Shell(bash)等。 shell 的另一个重要特性是它自身就是一个解释型的程序设计语言, shell 程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量和程序控制结构。 shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的 shell 程序中。 本质上, shell 脚本是命令行命令简单的组合到一个文件里面。 Shell 基本上是一个命 令解释器,类似于 DOS下的 。它接收用户命令,然后调用相应的应用程序 1。 管道是 Linux 支持的最初 Unix IPC形式之一,具有
10、以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在 于 内存中。一个进程向管道中写的内容被管道另一端的 进程读出 , 写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。 执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件( stdin),通常对应终端的键盘;标准输出文件( stdout)和标准错
11、误输出文件( stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 1.1.2 shell 的发展过程 2 标准的 UNIX shell 是 V7(AT&T的第七版 )UNIX,在 1979 年底被提 出,且以它的创造者 Stephen Bourne 来命名。 Bourne shell 是以 Algol 这种语言为基础来设计,主要被用来做自动化系统管理工作。虽然 Bourne shell 以简单和速度而受欢迎,但它缺少许多交谈性使用的特色,例如历程、别名和作业控制 4。 C shell 是在加州大学柏
12、克来分校于 70年代末期发展而成,而以 2BSD UNIX的部分发行。这个 shell 主要是由 Bill Joy 写成,提供了一些在标准 Bourne shell 所看不到的额外特色。 C shell 是以 C 程 序语言作为基础,且它被用来当程序语言时,能共享类似的语法。它也提供在交谈式运用上的改进,例如命令列历程、别名和作业控制。因为 C shell 是在大型机器上设计出来,且增加了一些额外功能,所以 C shell 有在小型机器上跑得较慢,即使在大型机器上跟 Bourne shell 比起来也显得缓慢。 有了 Bourne shell 和 C shell 之后, UNIX 使用者就有了
13、选择,且争论那一个 shell 较好。 AT&T 的 David Korn 在 80 年代中期发明了 Korn shell,在 1986 年发行且在 1988 年成为正式的部分 SVR4 UNIX。 Korn shell 实际上是 Bourne shell 的超集,且不只可在 UNIX 系统上执行,同时也可在 OS/2、 VMS、和 DOS上执行。它提供了和 Bourne shell 向上兼容的能力,且增加了许多在 C shell 上受欢迎的特色,更增加了速度和效率。 Korn shell 已历经许多修正版,要找寻用户使用的是那一个版本可在 ksh 提示符号下按 Ctrl-v 键。 在大部份的
14、 UNIX 系统,三种著名且广被支持的 shell 是 Bourne shell(AT&T shell,在 Linux 下是 BASH)、 C shell(Berkeley shell,在 Linux 下是 TCSH)和 Korn shell(Bourne shell的超集 )。这三种 shell 在交 互 (interactive)模式下的表现相当类似,但作为命令文件语言时,在语法和执行效率上就有些不同了。 Bourne shell 是标准的 UNIX shell,以前常被用来做为管理系统之用。大部份的系统管理命令文件,例如 rc start、 stop 与 shutdown 都 是 Bou
15、rne shell 的命令,且在单 用户 模式 (single user mode)下以 root 登录 时它常被系统管理 员 使用。 Bourne shell 是由 AT&T 发展的,以简洁、快速著名。 Bourne shell 提示符号的默认值是 $ 。 C shell 是柏克莱大学 (Berkeley)所开发的,且加入了一些新特性,如命令列历程(history)、别名 (alias)、内建算术、 文件 名完成 (filename completion)、和作业控制 (job control)。对于常在交 互 模式下执行 shell 的使用者而言,他们较喜爱使用 C shell;但对于系统
16、管理者而言,则较偏好以 Bourne shell 来做命令,因为 Bourne shell 命令比 C shell 命令来的简单及快速。 C shell 提示符号的默认值是 % 。 3 1.2 课题研究的目的与意义 编写简单的 shell命令例如 ls,cp,cat和 rm命令等并且介绍了 Shell相关的外部程序命令及管道和输入输出重定向功能,以加深对 Shell 这方面知识的理解,为此类程序的开发提供一定的启示性和指导性。 本课题的目的是 linux 下的 shell实现和开发,通过 c语言写出 shell下的命令,通过c的实现,更加了解管道和输入输出重定向,进一步加深对 linux系统的
17、了解。 1.3 课题的研究内容 研究的基本内容: 在 Linux环境下编写一个简单的 shell程序,达到以下要求: ( 1)能够执行外部程序命令,命令可以带参数; ( 2)能够实现管道和输入输出重定向功能。 实现的 shell能够解释并执行下列命令: ( 1) ls 列目录 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐 藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的大小,以容易理解的格式印出文件大小 (例如 1K 234M 2G) ls -lt 显示文件,按照修改时间排序 ( 2
18、) cp 文件拷贝 功能: copy文件 cp source target 将文件 source复制为 target cp /root /source. 将 /root下的文件 source复制到当前目录 cp ? av soure_dir target_dir 将整个目录复制,两目录完全一样 ( 3) rm 删除文件 功能: 删除文件 或目录 rm file 删除某一个文件 4 rm -f file 删除时候不进行提示。可以于 r参数配合使用 rm -rf dir 删除当前目录下叫 dir的整个目录 ( 4) who 显示当前登录的用户信息 功能:显示登录用户 ( 5) cat 显示文件内容
19、 显示文件的内容,和 DOS的 type相同 开 始A c = 3 ?跳 出YA v 1 = - 1 ?A v 2 = - 2 ?不 能 打 开文 件不 能 创 建文 件YYNN调 用 o o p s 函 数 显 示错 误 类 型A v 1 = a v 2 ?成 功结 束5 开 始A r g c = = 1 ?C = G e t c ha r ( ) ! = EO FC ! = n B u f i + + = cY打 印 b u fNi = 1i + +i a r g cF d = = - 1打 印 错 误读 内 存 是否 有 误成 功 输 出结 束NN6 2 Linux 下 shell 的开
20、发方法 2.1 c 语言简介 C 语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。 C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用 C语言明显优于其它解释型高级语言,有一些大型应用软件也是用 C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处 理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。 常用的 C 语言 IDE ( 集 成开 发 环 境 ) 有 Microsoft Visua
21、l C+ , Borland C+,Watcom C+ ,Borland C+ Borland C+ Builder,Borland C+ 3.1 for DOS,Watcom C+ 11.0 for DOS,GNU DJGPP C+ Lccwin32 C Compiler 3.1,Microsoft C,High C,TurboC 等等 . 2.2 c 语言的结构特点: 1.一个 C语言源程序可以由一个或多个源文件组成。 2.每个源文件可由一个或多个函数组成。 3.一个源程序不论由多少个文件组成,都有一个且只能有一个 main函数,即主函数。 4.源程序中可以有预处理命令 (include 命令仅为其中的一种 ),预处理命令通常应放在源文件或源程序的最前面。 5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“ ”之后不能加分号。 6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来 间隔。 2.3 c 语言的优点 1. 简洁紧凑、灵活方便 C 语言一共只有 32 个关键字 ,9 种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一