说明
本项目开源许可证为GPL 3.0
介绍
这是大一下学期的时候的一份程序设计实验作业。内容是,实现一个类似于bash的shell。本shell命名为gsh,意思是G's Shell(我姓氏首字母为G)。
由于本人之前并未接触过系统编程,所以参考了一份别人造的轮子。此处感谢vvy。主要参考部分为:输入命令的解析,内置指令cd的实现。
编译
本项目文件夹结构如下:
.
├── CMakeLists.txt
├── compile.sh
├── executable
│ └── gsh
├── include
│ ├── builtin.h
│ ├── color.h
│ ├── gsh.h
│ ├── prompt.h
│ ├── read.h
│ └── run.h
├── README.md
└── source
├── builtin.c
├── gsh.c
├── prompt.c
├── read.c
└── run.c
其中,gsh为在Ubuntu 16.04 64bit下使用gcc 5.3.1编译成的可执行文件。若要在不同的环境中编译相应版本,可以在项目主目录下运行
注:输入读取使用了readline库,如果在系统中没有自带,请安装
sudo apt-get install libreadline6
使用
在终端中运行可执行文件后,很快会见到一个哲♂学符号(当然,如果是以root用户的身份执行的,则会见到一个♀),如
这是gsh的特色哲♂学命令提示符。
警告:如果不是在Linux环境使用,那么有可能会造成出现一堆奇怪的字符。这是color.h的锅。我做的时候,为了好看,给文字加上了Linux特有的字体颜色前缀。为了保留最佳风味,请在Linux环境下食用。
如果有输入文件,如
其中script.gsh为输入的文件名(当然不一定要叫这个名字),那么程序就会按行执行指令。注意,这只是批量执行,文件里只有是合法输入的部分有效。
操作
本shell的基本操作与bash类似,即
本shell支持Tab键补全功能,但是能补全的仅仅是文件名且仅限于当前目录中的(-_-b)。
内置指令
本shell实现了以下几条内置指令:
- cd
- cp
- cmp
- wc
- quit
- philosophy
其中,cd -并没有实现,且cp和cmp都不支持参数。不过,cp的三种文件名组合顺序都有支持。wc命令支持且仅支持-l参数。
quit命令的功能是退出这个shell程序,返回它的父进程。至于philosophy命令,嘿嘿,其作用为打印一张比利王的帅照(ASCII码阵列)。这条指令,体现了本shell所代表的哲♂学思想。
当然,限于本人写代码的过程是学习的过程,因此对于非法输入、执行错误的报错会比较奇怪,很惭愧。
外部调用
外部调用可以的东西和bash相同。实际上,如果你用我实现的cp, cmp, wc不爽,大可在代码里删掉它们,然后用系统自带的。