shell命令解释器实验报告
- 格式:doc
- 大小:827.00 KB
- 文档页数:10
实验一Shell初步实验所属系列:linux操作系统应用实验。
实验时数(学分):2学时。
实验目的:使学生熟悉shell的基本操作,并使学生有机会使用Linux中最常用的数据处理命令。
实验要求:·使用通配符来进行文件名的查找。
·重定向标准输入、标准输出、标准错误输出。
·使用管道操作,将一个进程的输出作为另一个进程的输入。
·使用群命令和命令行续行符。
·在指定的目录中,对满足条件的文件名进行递归查找。
·了解vi编辑器的基本用法。
·在文本文件中,查找符合指定模式的文本行。
·将文本文件中的各行,按顺序排列。
·显示一个文本文件的前几行或者后几行。
简介:1.shell简介当用户登录到Linux上后,Linux将用户置于该用户的主目录下,并运行一个称为shell的程序。
shell是一个命令解释程序,它提供了操作系统与用户之间的主要界面。
除了解释用户从键盘上键入的命令外,shell也可以解释存储在文件中的命令。
事实上,Linux中的shell程序相当于MS-DOS中的COMMAND.COM程序。
在MS-DOS中,存储命令的文本文件称为批处理文件,扩展名为.bat。
但在Linux中,含有命令的文本文件称为shell脚本,可以具有任意的扩展名。
Shell脚本中的命令可以是Linux所提供的任何实用程序,也可以是专门由shell使用的特定控制命令流,用来控制shell脚本中各命令的执行次序。
现在的shell是一种功能非常强大而且非常灵活的工具,它所提供的许多功能使用户在操作系统下工作更简单。
shell实际上是一种编程语言,shell编程广泛地用于获取经常执行的命令和过程。
2.shell特殊变量在shell中,除了可以使用环境变量外,还可以使用专门由shell使用的shell特殊变量。
与环境变量不同的是,用户只能引用shell特殊变量,而不能设置这些变量的值。
试验一、Shell命令基础试验Linux常用工具一、Shell简介在Linux系统开发过程中,开发者或者用户与linux系统进行交互的时候需要一个平台,这就是shell。
有了他,用户就能通过键盘输入与系统进行交互了。
Shell会执行用户输入的命令,并且在屏幕上显示执行结果。
这种交互的全过程是基于文本方式的,这种面向命令行的用户界面被称为CLI(Command Line Interface)。
通俗的讲,Shell就是内部核心与外部使用者发生联系的介质。
当用户希望与系统内核发生联系进而控制硬件设备时,用户不会也不允许直接与内核交互,而必须通过Shell来下达命令使系统来控制硬件,同时内部核也会通过Shell来反馈执行情况,这里的Shell就是一个桥梁。
Shell工作示意图目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell 类型:#echo $SHELLBash(Bourne Again Shell)是目前大多数Linux系统默认使用的Shell,他由Brain Fox和Chet Ramey共同完成,内部命令一共有40个,他是Bourne Shell的扩展,与Bourne Shell完全向后兼容,并且在Bourne Shell的基础上增加了很多特性。
Bash是GNU计划的一部分,用来替代Bash Shell。
Linux使用他作为默认的Shell是因为他有以下特点:1.可以使用类似DOS下面的doskey的功能,用上下方向建查阅和快速输入并修改命令。
2.自动通过查找匹配的方式,给出以某字母开头的命令(TAB)3.包含了自身的帮助功能,只要在提示符下面输入help就可以得到相关的帮助。
Linux下使用Shell非常简单,打开终端就可以看到shell提示符了,我们使用的Cygwin没有提供X窗口系统,所以打开Cygwin软件就直接登陆了shell窗口。
实验二用户界面与Shell 命令实验环境:Linux 环境实验目的:(1)掌握图形化用户界面和字符界面下使用 Shell 命令的方法。
(2)掌握 ls、cd 等 Shell 命令的功能。
(3)掌握重定向、管道、通配符、历史记录等的使用方法。
(4)掌握手工启动图形化用户界面的设置方法。
实验内容:1.图形化用户界面下的 Shell 命令操作操作要求1:显示系统时间,并将系统时间修改为2011 年9 月17 日零点。
操作过程:(1)启动计算机,以超级用户身份登录图形化用户界面;用户名为root。
(2)依次单击顶部面板的「应用程序」菜单=>「附件」=>「终端」,打开桌面环境下的终端工具。
(3)输入命令“date”,显示系统的当前日期和时间。
(4)输入命令“date 0917********”,屏幕显示新修改的系统时间。
在桌面环境的终端结果:(1)输入命令“date”显示系统当前日期为:2015年4月20号星期一 18:16:12.(2)输入命令“date 0917********”修改系统的时间为2011年9月17号零点。
操作要求2:切换为普通用户,查看 2011 年 9 月 17 日是星期几。
操作过程:(1)输入“su - stu”命令切换当前用户为普通用户 stu。
(2)输入命令“cal 2011”,屏幕上显示出 2011 年的日历,结果:由下图可以看出2011 年 9 月 17 日是星期天。
操作要求3:查看 ls 命令的-s 选项的帮助信息操作过程:方法一:(1)输入“man ls”命令,屏幕显示出手册页中 ls 命令相关帮助信息的第一页,介绍ls 命令的含义、语法结构以及-a、-A、-b 和-B 等选项的意义。
(2)使用 PgDn 键、PgUp 键以及上、下方向键找到-s 选项的说明信息。
(3)由此可知,ls 命令的-s 选项等同于--size 选项,以文件块为单位显示文件和目录的大小。
一、实验内容Linux系统中,shell是用户和系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令界面。
用户在命令提示符($或是#)下输入的每一个命令都由shell解释,然后传给内核执行。
本实验是实现一个简单的shell,能在虚拟shell界面下响应一些简单的shell命令,不考虑输入/输出重定向以及管道。
二、简单shell命令解释器的分析命令解释执行的过程为:1.初始化虚拟shell界面;2.获取用户指令(命令和参数);3.解析指令;4.寻找命令文件;5.执行命令。
开始初始化虚拟shell界面获取用户指令解析指令寻找命令文件执行命令结束三、shell命令解析器的设计(1)在虚拟的shell界面上出现命令提示符($或#);(2)获取用户指令:获取用户在命令提示符后面输入的命令及其参数,并注意命令输入的最大长度;(3)解析指令:对用户输入的命令进行解析,解析出命令名和参数;(4)寻找命令文件:每个命令的执行都必须依靠对应的可执行文件,这些文件的存放路径存放在用户的PATH环境变量里;(5)执行命令:可通过fork( )系统调用创建一个进程来完成执行命令的任务,具体的命令执行用execv( )函数。
注:为了简化程序设计的难度,对涉及输入/输出重定向以及管道的命令不予考虑。
四、shell命令解析器实现的详细步骤1.在虚拟的shell界面上打印出命令提示符“#”或者“$”。
通常在Linux命名提示符前会有路径或者机器名,我们可以先获取到当前执行的路径,由此调用一个外部函数get_current_dir_path(),返回值是一个指向当前目录绝对路径的字符串指针,然后连接到命令提示符之前即可。
这样就得到了虚拟shell的命令提示行。
因为用户不是只执行一个指令就结束了,还需要等待用户继续输入,所以用一个while死循环来循环执行该解析器。
代码如下:char *path;while (1){path = get_current_dir_name();printf("%s>fangxu$",path);}2.获取用户输入的指令及其参数通过getchar()或者gets()方法来获取用户输入的指令,设置一个缓冲区buffer来存储用户的输入,并定义缓冲区大小,如果用户输入的指令太长超出缓冲区大小,则提示用户输入指令太长并重新输入。
实验报告实验名称:实现一个shell命令解释器学员:学号:年级:专业:所属学院:计算机学院指导教员:职称:实验室:实验日期:目录1.功能描述 (3)2.主要数据结构 (3)3.主要程序流程图 (4)4.主要功能实现方法和系统调用 (4)4.1初始化环境 (4)4.2打印提示符,获取用户输入 (5)4.3解析命令 (5)4.4执行命令 (5)4.4.1内部命令 (5)4.4.2外部命令 (5)4.4.3重定向功能 (6)4.4.4管道功能 (6)5.测试结果 (7)6.心得体会 (10)1.功能描述本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了内部命令(包括自定义命令)、外部命令、重定向功能和多管道等功能。
具体功能描述如下:1)内部命令:●可以使用常用的如cd、echo、history、exit等命令●自定义命令1)smile命令:打印出笑脸2)myinfo命令:打印出作者信息和版本信息2)外部命令:可实现cp、rm等所有外部命令。
3)重定向:通过输入重定向符号’<’ 或输出重定向’>’ ,把一行命令分成两部分,前者为需要执行的命令,后者为一个重定向文件。
输入重定向是把文件内容作为输入传到前面的命令中,而输出重定向则是把命令的结果传入重定向文件中。
4)管道:通过管道符号’|’ 把一条命令分成两部分,前一部分命令运行后,将结果放入管道,后一部分命令从管道中取出该结果,作为输入继续执行。
最多可以实现10个管道。
2.主要数据结构本程序主要使用字符数组进行命令、路径的存储与分析。
3.主要程序流程图命令的分析执行过程包括:初始化环境,打印提示符,获取用户输入命令,解析命令,寻找命令文件和执行命令,如图1。
图1程序设计流程图4.主要功能实现方法和系统调用下面将详细说明本shell解释器的实现原理和所用到的系统调用。
总结起来用到的系统调用主要有:Open();close();dup();pipe();execv();chdir();getcwd();如何使用这些系统调用实现shell的各项功能,下面将详细说明。
linux shell实验报告Linux Shell实验报告一、引言Linux Shell是一种命令行解释器,它是Linux操作系统的核心组成部分。
通过Shell,用户可以直接与操作系统进行交互,执行各种命令和程序。
本实验旨在探索Linux Shell的基本用法和功能,以及如何通过Shell脚本实现自动化任务。
二、Shell的基本用法1. 登录Shell在Linux系统中,可以通过终端或控制台登录Shell。
输入用户名和密码后,即可进入Shell环境。
2. Shell命令的基本格式Shell命令由命令名称和参数组成。
命令名称用于指定要执行的操作,而参数则用于指定操作的具体细节。
3. 常用Shell命令(1)ls:列出当前目录下的文件和文件夹。
(2)cd:切换当前工作目录。
(3)mkdir:创建新的文件夹。
(4)rm:删除文件或文件夹。
(5)cp:复制文件或文件夹。
(6)mv:移动文件或文件夹。
(7)cat:查看文件内容。
(8)grep:在文件中搜索指定的字符串。
(9)chmod:修改文件或文件夹的权限。
(10)ssh:通过网络连接到远程服务器。
三、Shell脚本的编写与执行1. Shell脚本的基本结构Shell脚本是一系列Shell命令的集合,可以按照特定的顺序执行。
一个典型的Shell脚本包含以下几个部分:(1)Shebang:指定脚本的解释器。
(2)注释:用于解释脚本的用途和功能。
(3)变量定义:定义脚本中使用的变量。
(4)函数定义:定义脚本中使用的函数。
(5)主体代码:包含实际执行的命令。
2. Shell脚本的执行要执行一个Shell脚本,可以使用以下命令:```shellchmod +x script.sh./script.sh```首先,使用chmod命令给脚本添加可执行权限。
然后,使用./命令来执行脚本。
3. Shell脚本的实例以下是一个简单的Shell脚本示例,用于统计一个文件中指定字符串的出现次数:```shell#!/bin/bash# 统计指定字符串的出现次数count=$(grep -o "keyword" file.txt | wc -l)echo "出现次数:$count"```此脚本通过grep命令在file.txt文件中搜索关键字"keyword",并使用wc命令统计匹配行的数量。
Shell编程基础姓名:学号:520913080429专业:信息安全09-04实验内容:命令提示:上下键~/.bash_history权限不够,试着用VIM查看指令补全与文件名称补全alias lm='ls -al'unalias lm定义别名将lm定义为‘ls -al’Shell scripts编程变量与变量的设定:echo, env, set, 变量设定规则, export, unset echo $PATH有多少的环境变量呀?使用env 与set 来看看echo $? 上一个命令的返回值变量设定规则:变量与变量内容以等号『=』来连结;等号两边不能直接接空格符;变量名称只能是英文字母与数字,但是数字不能是开头字符;若有空格符可以使用双引号『" 』或单引号『' 』来将变量内容结合起来,但须要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;若该变量为扩增变量内容时,则需以双引号及$变量名称如:『"$PATH":/home』继续累加内容;若该变量需要在其它子程序执行,则需要以export 来使变量可以动作,如『export PATH』;通常大写字符为系统预设变量,自行设定变量可以使用小写字符;一般变量设定:name=VBirdname="VBird name"变量累加设定name="$name"ismePATH="$PATH":/home/test单引号双引号` 三种符号的不同含义myname="$name its me"myname='$name its me'cd /lib/modules/`uname –r`键盘定义变量值read name数组:a[1]=4a[2]=8echo ${a[1]} ${a[2]}随机数:echo $RANDOM定义变量[root@localhost home]# name=zhangshan[root@localhost home]# name1='zhang san'[root@localhost home]# name2="zhang san"[root@localhost home]# echo $namezhangshan[root@localhost home]# echo $name1zhang san[root@localhost home]# echo $name2zhang san[root@localhost home]#bash shell 的设定档案系统设定值/etc/profile这个档案设定了几个重要的变量,例如:『PATH、USER、MAIL、HOSTNAME、HISTSIZE、umask』所有的使用者皆会使用到这个档案的信息。
实验报告⼆⽤户界⾯与Shell命令实验⼆⽤户界⾯与Shell 命令实验环境:Linux 环境实验⽬的:(1)掌握图形化⽤户界⾯和字符界⾯下使⽤ Shell 命令的⽅法。
(2)掌握 ls、cd 等 Shell 命令的功能。
(3)掌握重定向、管道、通配符、历史记录等的使⽤⽅法。
(4)掌握⼿⼯启动图形化⽤户界⾯的设置⽅法。
实验内容:1.图形化⽤户界⾯下的 Shell 命令操作操作要求1:显⽰系统时间,并将系统时间修改为2011 年9 ⽉17 ⽇零点。
操作过程:(1)启动计算机,以超级⽤户⾝份登录图形化⽤户界⾯;⽤户名为root。
(2)依次单击顶部⾯板的「应⽤程序」菜单=>「附件」=>「终端」,打开桌⾯环境下的终端⼯具。
(3)输⼊命令“date”,显⽰系统的当前⽇期和时间。
(4)输⼊命令“date 0917********”,屏幕显⽰新修改的系统时间。
在桌⾯环境的终端结果:(1)输⼊命令“date”显⽰系统当前⽇期为:2015年4⽉20号星期⼀ 18:16:12.(2)输⼊命令“date 0917********”修改系统的时间为2011年9⽉17号零点。
操作要求2:切换为普通⽤户,查看 2011 年 9 ⽉ 17 ⽇是星期⼏。
操作过程:(1)输⼊“su - stu”命令切换当前⽤户为普通⽤户 stu。
(2)输⼊命令“cal 2011”,屏幕上显⽰出 2011 年的⽇历,结果:由下图可以看出2011 年 9 ⽉ 17 ⽇是星期天。
操作要求3:查看 ls 命令的-s 选项的帮助信息操作过程:⽅法⼀:(1)输⼊“man ls”命令,屏幕显⽰出⼿册页中 ls 命令相关帮助信息的第⼀页,介绍ls 命令的含义、语法结构以及-a、-A、-b 和-B 等选项的意义。
(2)使⽤ PgDn 键、PgUp 键以及上、下⽅向键找到-s 选项的说明信息。
(3)由此可知,ls 命令的-s 选项等同于--size 选项,以⽂件块为单位显⽰⽂件和⽬录的⼤⼩。
linux shell 实验报告Linux Shell 实验报告一、引言Linux Shell 是一种命令行解释器,它允许用户与操作系统进行交互。
作为一个开源的操作系统,Linux 提供了多种 Shell,如 Bash、Zsh、Ksh 等,每种 Shell 都有其特点和用途。
本实验旨在通过实际操作,深入了解 Linux Shell 的使用和功能。
二、实验目的1. 熟悉 Linux Shell 的基本概念和操作;2. 掌握 Shell 的常用命令和参数;3. 理解 Shell 脚本的编写和执行过程。
三、实验环境本次实验使用的实验环境为 Ubuntu 20.04 LTS 操作系统,使用默认的 Bash Shell。
四、实验内容1. Shell 基本操作在 Linux 系统中,打开终端即可进入 Shell 环境。
Shell 提供了丰富的命令用于文件操作、系统管理等。
以下是一些常用的 Shell 命令示例:- ls:列出当前目录下的文件和子目录;- cd:切换当前工作目录;- mkdir:创建新目录;- rm:删除文件或目录;- cp:复制文件或目录;- mv:移动文件或目录。
2. Shell 变量和环境变量Shell 变量用于存储数据,可以通过赋值和引用来操作变量。
环境变量是一种特殊的 Shell 变量,用于存储系统环境的信息。
以下是一些常用的变量和环境变量示例:- 变量赋值:name="John";- 变量引用:echo $name;- 环境变量:$HOME、$PATH、$USER。
3. Shell 脚本编写与执行Shell 脚本是一种批处理文件,由一系列命令组成,可以实现自动化操作。
以下是一个简单的 Shell 脚本示例:```shell#!/bin/bashname="John"echo "Hello, $name!"```将上述脚本保存为 `hello.sh`,通过 `chmod +x hello.sh` 命令给予执行权限,然后通过 `./hello.sh` 执行脚本。
Linux实验报告(实验四)shell编程实验实验四 shell编程实验(二)班级:姓名:学号:上机时间:年月日任课教师:实验教师:实验成绩:一、实验目的综合Linux常用命令和vi编辑器的使用,熟练掌握shell脚本编程。
二、实验注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。
以后所有工作都要在自己的目录内进行。
建议以后的实验都在同台计算机上做,这样可以保持连续性。
三、实验内容1. 编写一个脚本,求斐波那契数列的前10项及总和。
num1=1num2=1echo -n “$num1+$num2”sum=2for((i=1;i<=8;i++))dotmp=$(expr $num1 + $num2)echo -n “+$tmp”((num1=num2))((num2=tmp))sum=$(expr $sum + $tmp)doneecho “=$sum”2.编写一个脚本,求一个数的逆序。
echo -n please input num:read numecho -n The num iswhile [ $num -gt 0 ]dosd=$(($num % 10))echo -n "$sd"num=$(($num/10))doneecho3.设计一个Shell程序,在用户主目录下建立一个userdata目录,在此目录下再建立5个目录,即user1~user5,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
(注意:最后删除自己所建立的目录,恢复原样,以便后面同学做此实验)mkdir -m 754 /home/userdatai=1temp=/home/userdata/userwhile[ $i -le 5 ]domkdir -m 754 $temp$ilet”i=i+1”#done4.用Shell编程,判断一文件是不是普通文件,如果是将其拷贝到/home/student/test 目录下,用命令查看test目录内容,最后再删除test目录。
操作系统实验报告(shell命令解释器)目录1功能描述 (2)2主要数据结构 (2)3主要自定义函数功能及接口说明 (3)4主要功能实现方法和系统调用 (4)4.1重定向功能 (4)4.2多管道功能 (4)4.3命令的后台运行 (5)4.4历史命令 (6)4.5CD命令 (6)4.6其他简单命令 (6)4.7其他自定义命令 (6)5心得体会 (6)6源代码 (7)1功能描述(用红色标示的字体显示了本解释器完成的基本功能)本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了重定向功能和多管道、后台运行等功能。
具体功能描述如下:1)解释器的命令格式为cmd1[<infileName][|cmd2][|cmd3]…[|cmdn][>or>>outfileName][&]2)cmdi为命令名+参数形式的命令,<为输入重定向,后跟输入重定向文件名infileName;>或>>后跟输出重定向文件名,输出内容将写入outfileName,>>表示以追加方式写入文件,>则表示以覆盖方式写入;3)实现了多管道4)命令结尾可加后台运行符号& ,表示此命令将以后台运行的方式执行5)实现了cd命令6)exit为退出命令7)history为历史命令,可以显示最近执行的命令,最多100条8)!i为执行历史命令,意为执行第i条历史命令。
!!为执行上一条命令。
9)’|’为管道符号,使用|符号隔开的若干条命令之间,前一条命令的输出是后一条命令的输入。
10)自定义命令myname,将输出此Shell的版本信息11)本解释器命令格式中的简单命令可为所有外部命令和一部分内部命令和自定义命令2主要数据结构本shell解释器实现手法上非常直观易懂,没有用到复杂的数据结构。
运行过程中大部分数据采用字符数组的形式存储。
其中定义了命令结构类型cmd,用以表示一条简单命令。
操作系统课程设计报告学院:计算机科学与工程学院班级: *****************学生姓名: ***************** 学号: *****************指导老师:提交日期:一、课程设计目的本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。
二、课程设计要求设计一设计任务:模拟Linux文件系统在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux 文件系统。
1.在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。
2.编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求:(1)盘块大小1k(2)空闲盘块的管理:Linux位图法(3)结构:超级块, i结点区, 根目录区3.该simdisk管理程序的功能要求如下:(1)info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。
目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。
(2)cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。
(3)dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。
(4)md …: 创建目录:在指定路径或当前路径下创建指定目录。
重名时给出错信息。
(5)rd …: 删除目录:删除指定目录下所有文件和子目录。
要删目录不空时,要给出提示是否要删除。
(6)newfile …: 建立文件。
(7)cat …: 打开文件。
(8)copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为<host>…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令:simdisk copy <host>D:\data\sample\test.txt /test/data或者:simdisk copy <host>D:sample\test.txt /test/data(9)del …: 删除文件:删除指定文件,不存在时给出出错信息。
S h e l l编程实验报告 Prepared on 22 November 2020南京信息工程大学实验(实习)报告【实验目的】1、了解和熟悉创建并使用脚本的步骤。
2、熟悉bash的控制结构。
3、学会简单的shell编程。
【实验内容】1、创建一个简单的列目录和日期的shell 脚本并运行之。
步骤:⑴输入下列命令,创建一个新文件:cat >new_script⑵输入下列行:echo “Your files are”lsecho “today is”date按回车键将光标移到一个新行,按Ctrl+D键保存并退出。
⑶检查文件内容,确保它是正确的:cat new_script⑷运行脚本,输入它的文件名:new_script该脚本不运行。
⑸输入下列命令,显示文件的权限:ls –l new _script权限表明该文件不是可执行。
要通过简单调用文件名来运行脚本,必须有权限。
⑹输入下列命令,使new_script变成可执行文件。
chmod +x new_script⑺要查看新的权限,输入:ls –l现在拥有文件的读、写和执行权限。
⑻输入新脚本的名字以执行它:new_script所有输入到文件的命令都执行,并输出到屏幕上。
⑼如果接收到错误信息,比如:command not found输入下列命令:./new_script该命令行通知shell到哪里寻找shell脚本new_script,即您的当前目录“.”。
程序运行过程如下:2、用Shell 语言编制一Shell 程序,该程序在用户输入年、月之后,自动打印数出该年该月的日历。
程序运行过程如下:3、编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program”。
程序运行过程如下:4、修改上述程序,编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同显示“Match”,不同则显示“Not match”,最后显示“End of program”。
操作系统实验报告(shell命令解释器)目录1功能描述 (2)2主要数据结构 (2)3主要自定义函数功能及接口说明 (3)4主要功能实现方法和系统调用 (4)4.1重定向功能 (4)4.2多管道功能 (4)4.3命令的后台运行 (5)4.4历史命令 (6)4.5CD命令 (6)4.6其他简单命令 (6)4.7其他自定义命令 (6)5心得体会 (6)6源代码 (7)1功能描述(用红色标示的字体显示了本解释器完成的基本功能)本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了重定向功能和多管道、后台运行等功能。
具体功能描述如下:1)解释器的命令格式为cmd1[<infileName][|cmd2][|cmd3]…[|cmdn][>or>>outfileName][&]2)cmdi为命令名+参数形式的命令,<为输入重定向,后跟输入重定向文件名infileName;>或>>后跟输出重定向文件名,输出内容将写入outfileName,>>表示以追加方式写入文件,>则表示以覆盖方式写入;3)实现了多管道4)命令结尾可加后台运行符号& ,表示此命令将以后台运行的方式执行5)实现了cd命令6)exit为退出命令7)history为历史命令,可以显示最近执行的命令,最多100条8)!i为执行历史命令,意为执行第i条历史命令。
!!为执行上一条命令。
9)’|’为管道符号,使用|符号隔开的若干条命令之间,前一条命令的输出是后一条命令的输入。
10)自定义命令myname,将输出此Shell的版本信息11)本解释器命令格式中的简单命令可为所有外部命令和一部分内部命令和自定义命令2主要数据结构本shell解释器实现手法上非常直观易懂,没有用到复杂的数据结构。
运行过程中大部分数据采用字符数组的形式存储。
其中定义了命令结构类型cmd,用以表示一条简单命令。
学年第学期操作系统课程实验报告学院:专业:班级:姓名:学号:任课教师:摘要shell 是一个命令处理器(command processor)——是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。
它是一个交互性命令解释器。
shell 独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。
shell 让你在命令行键入命令,经过shell 解释后传送给操作系统(内核)执行。
Shell是一个管理进程和运行进程的程序。
有三个主要功能。
(1)运行程序:shell是一个程序启动器。
(2)管理输入和输出:shell将进程的输入和输出连接到一个文件或其他的进程。
(3)编程关键字:shell;解释器;程序;实验日期:2017年6月12日exit(1);default:while(wait(&exitstatus)!=pid);printf("child exited with status %d,%d\n",exitstatus>>8,exitstatus&0377);}}char *makestring(char *buf){char *cp,*malloc();buf[strlen(buf)-1]='\0';cp=malloc(strlen(buf)+1);if(cp==0){fprintf(stderr,"no memory\n");exit(1);}strcpy(cp,buf);return cp;}3.测试运行结果(1)分别执行psh1和psh2,执行过程中,输入ps命令写出两个程序运行的结果。
并分析区别和原因。
(2)在执行psh2过程中,输入./psh1和ps命令写程序运行的结果。
(1)实验结果分析:在psh1.c中,构造函数intexecute(){execvp(arglist[0],arglist); ;exit(1);}只执行一次,所以在输入ps后直接自动退出;在psh2.c中,构造函数int execute(char *arglist[]){ switch(){case -1: ; exit(1);case 0: execvp(arglist[0],arglist); exit(1);Default: }}运用switch函数,所以在输入ps后仍继续执行。
《操作系统与Linux》实验报告实验名称:实验二Linux中Shell基本命令的使用实验日期:2011年11月2日班级:B09513学号:20094051311姓名:王晓珍计算机号:一、实验目的1.掌握Shell基本命令的使用方法(命令补全、通配符、历史记录、别名、输出重定向、使用管道、作业控制)。
二、实验内容1、命令补全:1)登录后进入home目录并建立子目录mlbq,在mlbq子目录中建立如下子目录:news、bin、games、mail、programs、test。
[root@localhost ~]# cd ..[root@localhost /]# cd home[root@localhost home]# mkdir mlbq[root@localhost home]# cd mlbq[root@localhost mlbq]# mkdir news bin games mail programs test2)通过命令补全功能只输入字母t进入test子目录。
[root@localhost mlbq]# cd test/3)在mlbq子目录中再建立一个子目录tools,如何通过命令补全功能进入test子目录。
[root@localhost test]# cd ..[root@localhost mlbq]# mkdir tools[root@localhost mlbq]# cd test/[root@localhost test]#4)在mlbq子目录下输入命令cd t<tab><tab>,出现什么结果。
[root@localhost mlbq]# cd ttest/ tools/2、通配符:1)在mlbq子目录中通过touch命令建立如下文件:ch1.doc、ch2.doc、ch3.doc、ch4*、ch5*。
[root@localhost mlbq]# touch ch1.doc[root@localhost mlbq]# touch ch2.doc ch3.doc ch4* ch5*[root@localhost mlbq]# lsbin ch2.doc ch4* games news testch1.doc ch3.doc ch5* mail programs tools2)通过通配符“*”列出mlbq子目录中所有文件扩展名为“.doc”的文件。
实验一 Linux的安装、Shell命令以及X 窗口系统的使用班级:14194811 学号:14194822 姓名:吴林泽一、实验目的:熟练使用Linux字符界面的常用命令熟练运用Linux的在线求助系统。
练习X 窗口系统中常用的应用工具二、实验内容:文件处理命令1. ls命令英文原义:list (显示目录文件及其属性)执行权限:all user语法:ls 选项[-alFR] [文件或目录]-a 显示所有文件包括隐藏文件-l 使用long format 长格式进行显示-F 附加文件类别符号在文件名最后-R 显示目录及其下的子目录内容示例:$ ls –a$ ls –l说明:“.”代表当前目录,“..”代表上一层目录,长格式显示的目录或文件属性包括下列七项:文件权限(r-可读, w-可写, x-可执行)、文件数目、所有者、文件大小、建立日期、文件名。
参见“2.2.2 文件基础”。
2. cd命令英文原义:change directory (切换目录)执行权限:all user语法:cd [目录]示例:$ cd .. 回到上层目录$ cd . 在原目录$ cd ~ 回到user的home directory$ cd / 切换到根目录$ cd ../usr 切换到上一层目录的usr目录pwd3. pwd命令英文原义:print work directory(显示当前所在目录)执行权限:all user语法:pwd示例:$ pwd说明:由于Linux系统的树状目录结构颇为庞大,若没有使用Shell环境变量指定在Shell 提示符显示当前的工作目录,则不断地使用cd切换目录之后,可能会忘记当前所在的目录是哪里,例如在:/usr/bin和/usr/local/bin。
一般Shell提示符只显示最后的目录名称bin/,所以会对所在目录产生混淆,因此可以随时用pwd命令了解当前的工作目录/usr /X11R6/bin.显示当前工作目录为/usr/X11R6/bin4.cp ,rm, mv,mkdir 命令英文原义:copy,remove,move, make directory (复制、删除、移动文件,创建目录) 执行权限:all user语法:cp -afpx [源文件或目录][目地文件或目录]-a archive的意思相当于-dpR,也就是复制所有目录并包括子目录-f 强制复制文件-p 保留原始文件的日期-x 指定文件复制后属于目的磁盘的文件系统,如:ext2->fat32语法:rm -irf[文件或目录]-r 删除目录及其下的所有目录内容-f 强制删除-i 交互模式,删除前再做一次确认语法:mv –if [源文件或目录][目地文件或目录]5.1n命令英文原义:link (产生连接文件)执行权限:All User语法:ln –s [源文件][目录文件] ( -s symbolic link, 符号连接)示例:ln –s /bin/less /usr/local/bin/less说明:当需要在不同的目录用到相同的文件时,不需要在每一个需要的目录下都放一个相同的文件,只要在某个固定的目录中,放上该文件,然后在其他的目录用ln命令连接它即可,不必重复占用硬盘空间而节约磁盘空间。
LINUX操作系统大作业报告姓名XXX学号姓名XXX学号姓名XXX学号指导教师XX学期2011 至2012 学年第二学期完成时间2012 年01 月03 日Linux 操作系统设计性实验报告学生姓名XXXXXX XXX学号 教学班 B01实验项目 模拟命令解释器Myshell 的设计实验地点 H527 实验最后完成时间 2012年01月05日必修√选修指导教师XX同组人指导教师评语及成绩:成绩: 指导教师签名: 日期:打印稿记录等级迟交: 抄袭:一、实验综述㈠实验目的及要求1.实验目的:Linux/UNIX 系统中,shell 是用户和系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令界面。
用户在命令提示符($或是#)下输入的每一个命令都由shell 解释,然后传给内核执行。
本实验要求用C 语言编写一个模拟shell 命令解释器,达到如下目的: ● 用C 语言编写清晰易读、设计优良的程序;● 在编写系统应用程序时熟练使用man 手册或其他查询命令、系统调用和库函数的工具。
● 学习使用文件操作、进程控制、信号、管道相关程序设计方法和系统调用; ● 锻炼团队成员之间的交流和合作完成项目能力。
2.实验要求:设计并实现一个Linux 下的的交互式shell 命令解释器:MyShell ;以模拟unix/linux 系统下的完善的bash shell 的功能。
不需要具备非常完备的shell 功能。
主要有如下功能: ● 初始化环境,主要是默认搜索路径、history 循环数组、作业列表●打印命令提示符;●接受、识别和分析命令提示符后输入的命令行,并创建子程序,在子程序中将其转换为相对的系统调用以调用内核功能实现任务;●能实现内部命令,包括:exit(退出shell)、history、cd、jobs、bg、fg。
●能够执行外部命令,并到搜索路径中去查找外部命令对应的执行文件;命令均可带参数;●支持&、|、<、>四个特殊字符及其所代表的功能;●支持前、后台作业控制,包括fg/bg/jobs以及ctrl+c/ctrl+z(挂起、中止和继续运行)。
实验报告实验名称:实现一个shell命令解释器学员:学号:年级:专业:所属学院:计算机学院指导教员:职称:实验室:实验日期:目录1.功能描述 (3)2.主要数据结构 (3)3.主要程序流程图 (4)4.主要功能实现方法和系统调用 (4)4.1初始化环境 (4)4.2打印提示符,获取用户输入 (5)4.3解析命令 (5)4.4执行命令 (5)4.4.1内部命令 (5)4.4.2外部命令 (5)4.4.3重定向功能 (6)4.4.4管道功能 (6)5.测试结果 (7)6.心得体会 (10)1.功能描述本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了内部命令(包括自定义命令)、外部命令、重定向功能和多管道等功能。
具体功能描述如下:1)内部命令:●可以使用常用的如cd、echo、history、exit等命令●自定义命令1)smile命令:打印出笑脸2)myinfo命令:打印出作者信息和版本信息2)外部命令:可实现cp、rm等所有外部命令。
3)重定向:通过输入重定向符号’<’ 或输出重定向’>’ ,把一行命令分成两部分,前者为需要执行的命令,后者为一个重定向文件。
输入重定向是把文件内容作为输入传到前面的命令中,而输出重定向则是把命令的结果传入重定向文件中。
4)管道:通过管道符号’|’ 把一条命令分成两部分,前一部分命令运行后,将结果放入管道,后一部分命令从管道中取出该结果,作为输入继续执行。
最多可以实现10个管道。
2.主要数据结构本程序主要使用字符数组进行命令、路径的存储与分析。
3.主要程序流程图命令的分析执行过程包括:初始化环境,打印提示符,获取用户输入命令,解析命令,寻找命令文件和执行命令,如图1。
图1程序设计流程图4.主要功能实现方法和系统调用下面将详细说明本shell解释器的实现原理和所用到的系统调用。
总结起来用到的系统调用主要有:Open();close();dup();pipe();execv();chdir();getcwd();如何使用这些系统调用实现shell的各项功能,下面将详细说明。
4.1 初始化环境用init_environ()函数进行初始化,准备好执行外部命令可能用到的路径。
⏹void init_environ()程序初始化,打开路径文件os_profile,调用getenviron()函数,将查找路径放入envpath[]中。
⏹void getenviron(char *str)将路径文件中可能的路径按':'分开,存入envpath[]中。
4.2 打印提示符,获取用户输入用一个死循环接受用户的输入,直到用户输exit命令。
每次打印出当前的工作目录。
getcwd(dir,sizeof(dir)),利用getcwd这个系统调用获取当前工作目录的绝对路径。
4.3 解析命令用一个for循环遍历用户输入input,按照空格’’把各个分词分解开并依次存入arg[ ]数组。
Input中碰到’|’,就去执行pipel( )函数,处理管道命令;碰到’<’,就去执行redirect_in(),处理输入重定向命令;碰到’>’,就去执行redirect_out(),处理输出重定向命令。
处理完管道和重定向命令后,接着处理自己写的内部命令,最后剩下的就是外部命令。
4.4 执行命令4.4.1 内部命令1)cd命令cd命令的实现利用chdir(arg[1])这个系统调用,将目录改到arg[1]的值。
2)echo命令将arg[1]打印出来。
3)history命令用全局变量cmd_num计数,打印出命令序号和相应的用户输入。
4)exit命令当用户输入exit时,打印出“bye,bye ~~”,并break出程序的主for循环,退出自己写的shell。
5)自定义命令1)smile命令打印出一个笑脸*^_^*,此命令有点娱乐成分。
2)myinfo命令打印出作者信息author:zhaojingyue 201106021031和版本信息updating time:2013.12.104.4.2 外部命令首先用is_founded( )函数把外部命令的执行文件路径存入buf,接着用fork 系统调用建立一个子进程用于执行该外部命令,然后用execv到buf说存储的路径下执行arg所对应的命令,最后用waitpid向父进程发信号。
其中,is_founded( )函数具体实现如下:int is_founded(char *cmd)程序初始化时,已经将命令可能存在的路径置于envpath[i]数组中,函数is_founded 做的工作就是把路径和命令存入buf 数组中,在相应的路径下查找、判断命令是否存在,如果找到返回1,没有则返回0。
判断时用到系统调用函数access。
4.4.3 重定向功能我把重定向分为输入重定向redirect_in()和输出重定向redirect_out()两个函数来处理。
⏹redirect_in()输入重定向就是把改变命令的输入对象。
先用open这个系统调用以只读方式打开命令中指出的文件,然后用dup将标准输入的文件描述符保存在save_fd中,接着是关键的dup2,用刚刚打开的文件替换掉标准输入,这样就实现了重定向,最后用调用close关闭文件,不让它继续被用。
接下来的操作同外部命令的处理一样,用is_founded(arg[0])函数找到命令执行程序,fork子进程,execv执行此命令,waitpid等待子进程结束发信号给父进程。
执行玩命令之后不要忘了再dup2回来,用一开始保存在save_fd中的文件描述符替换掉现在的标准输入,这样,标准输入就是正常的了。
⏹redirect_out()输出重定向就是把改变命令的输出对象。
先用open这个系统调用以可写方式打开命令中指出的文件,第二个参数是O_RDWR|O_CREAT|O_APPEND,即若文件不存在就创建一个,然后把要写入的内容拼接在原文件的后面。
然后用dup将标准输出的文件描述符保存在save_fd 中,接着是关键的dup2,用刚刚打开的文件替换掉标准输出,这样就实现了重定向,最后用调用close关闭文件,不让它继续被用。
接下来的操作同外部命令的处理一样,用is_founded(arg[0])函数找到命令执行程序,fork子进程,execv执行此命令,waitpid等待子进程结束发信号给父进程。
执行玩命令之后不要忘了再dup2回来,用一开始保存在save_fd中的文件描述符替换掉现在的标准输出,这样,标准输出就是正常的了。
4.4.4 管道功能管道功能用自定义函数pipel()实现。
⏹pipel()该函数实现了连续执行多条管道的功能,最多可连续执行10条管道。
函数主要执行流程如下:1)初始化10个管道的读、写端,都置为-1。
2)进行命令解析,把各条命令分解存到argp[][]二维数组中,遇到管道符号”|”则置为NULL。
3)用系统调用pipe(fd[I])创建li_cmd个管道。
4)接下来进入for循环,一条一条执行命令。
每条命令的执行过程如下:a)调用is_founded(argp[i][0])函数找到命令执行文件。
b)把命令的读端赋给pipe_in(第一条命令除外),把命令的写端赋给pipe_out(最后一条命令除外)。
c)用fork调用子进程执行命令。
d)调用dup2用命令的读端pipe_in代替标准输入然后关闭pipe_in,用命令的写端pipe_out代替标准输出然后关闭pipe_out。
对于第一条命令无需改变读端,对于最后一条命令无需改变写端。
e)设置好读写端后,调用execv执行命令。
5.测试结果✧内部命令测试:分别输入echo、myinfo、smile、history、cd、exit命令,并查看结果。
✧外部命令测试:分别输入ls、wc、man命令,并查看结果。
man命令的详细结果:重定向文件zhao中,再用ls命令检查是否新建了zhao文件。
然后用cat命令查看zhao文件的结果,最后把zhao作为wc命令的输入,并查看结果。
管道命令测试:测试1个、2个和3个管道。
6.心得体会罗老师一直很强调能力的培养,非常重视这个实验。
他说我们听课、考试,锻炼的只是我们的记性,考完试就都还给老师了。
虽然我不是十分认同这个观点,但我觉得这种说法是有一点道理的。
因为无论是上学期学习的计算机原理还是这学期开设的操作系统、计算机网络、数据链等等课程,只是课堂听老师讲解、传授知识,即使理解透彻了,也还是十分抽象,落实不到真正的技术实现上,解决不了实际问题。
要真正理解掌握,真正有所体会,还是得靠自己动手,从这学期的cpu实验、网络实验也可以看出实践的重要性。
“自己动手实践过的,一辈子都忘不了。
”这是罗老师、蔡老师等原话,我深以为然也。
以前常常自嘲说:“deadline是第一生产力”。
一直很难克服自己的拖延症,这次的实验也不例外。
刚开始的时候虽然课程也比较紧张,但还是有一些时间的,但因为贪玩、畏难迟迟没有开始。
到后来各种大实验一来,就更加觉得时间不够用了。
人总是要逼一逼自己的,或许这样才能出成果。
于是硬着头皮开始了shell 命令解释器的实验。
一开始的时候,是先从熟悉Linux系统开始的,用惯了图形化的Windows,我甚至连终端是什么,在哪里打开都不知道。
更不理解我要做的到底是个什么东西,什么是命令解释器,我最后要呈现出一个什么样的效果才算完成。
然后就对照着《实验指导书》,从熟悉Linux的操作和各种命令开始,到学会gcc编译,再到着手编写shell命令解释器。
一步一步,走得艰难但印象深刻,缓慢而脚踏实地。
编写shell命令解释器的过程中,让我体会最深的两点,一是程序设计的框架,二是各种系统调用的使用。
开始的时候,跟着实验指导书做,但发现指导书上的是一些程序片段,程序的框架结构,要自己先构思好,不然编起来会思路不清。
我也是程序写到后来才渐渐意识到框架问题的,哪些单独做成一个函数放在main的外面,哪些直接在main里面写,各个模块、函数之间的逻辑结构又是怎样的,这个很重要。
尤其对于这种,for里套for的程序结构,更有搞清楚,不然很容易陷进去出不来。
为了实现一些命令,要使用各种系统调用。
让我印象最深的是fork、dup2和open。
Fork子程序调用让我第一次在编程中体会到程序的并行执行,尤其是周鹏上课时问老师的那个问题,哪些是父进程执行,哪些是子进程执行,哪些都会执行,简直太有趣了。
用dup2是为了做重定向和管道,其中重定向还要注意在dup2之前先dup一个,保存一下,结束之后在dup2回来。
当然还有用来打开文件的open,由于open的参数的可能情况太多,涉及到各种权限,每次都要去查一下,还是没有完全记住。