背景

顺利拿到心目中的理想offer之后,心里的负担一下减轻了很多,希望利用还没毕业之前这段难得的悠闲时间做一点有意义的事情。于是希望能做一个长久以来都想做的开源项目,就是题中提到的Windows下的shell解释器,之所以选择这个是因为之前在数据中心实习,shell脚本用的得心应手,但是因为平时开发脱离不开windows,经常要写一些bat脚本自动化小工具,觉得batch的语法和参数都很奇葩。因此萌生了写一个shell解释器的想法,当然后来因为工作量的缘故,去掉了一些shell的特性,保留了一些易于实现、经常使用且工作量不是太大的特性,比如管道、分号分隔命令、重定向等。这篇文章我会介绍整个开发过程中需要的知识背景和具体思路实现,源代码和可执行文件已上传至我的GITHUB,欢迎关注。

   

用到的技术

   首先,要解释任何语言,必然要做词法分析和语法分析。当然,如果你就用正则表达式也能识别部分语法,但是相对来说,正则的能力有限,而且所需的代码量也会比较复杂(相对使用lex和yacc这种生成工具来说)。这里分享一个对我很有帮助的资料:http://pchou.info/resource/2013/12/31/compiler.html

其次就是具体用什么编写了,最初我有两种备选方案:C和python,这两种语言来编写各自有各自的优势。C可以直接用lex和yacc来生成词法分析器和语法分析器,lex和yacc的规则文件功能也很强大,帮助资源也很丰富。但是lex和yacc的Win32版本实际用下来之后发现并不理想,有些原有规则并不能很好的支持,而且Windows C编程适用面较窄,可能对我产生不了太大的学习价值。而python的PLY(lex和yacc的python一种实现)实际使用下来之后感觉很好,而且定义词法语法规则甚至比lex和yacc还要简单。因此最后确定了使用python来编写这个解释器Shell4Win

   搞定词法和语法分析之后就相对简单很多了,我们从输入读取命令后根据语法分析的结果获取要执行命令的名称和参数(如果语法正确的话),然后绑定相应的方法。没有对应的命令就提示命令不存在。

存在的问题

正如前面提到的,shell的很多功能都没有提供支持,比如argument,就是诸如”ls –l”里面的”-l”,主要是因为shell里几乎每个命令都提供了相当多的参数,以至于要把这些命令的参数都实现的话,就是一个很庞大的工程了。因此我的做法是实现常用命令的常用参数,比如我们使用ls命令的时候往往是ls –l每个文件作为一行返回。这样做可以在满足大部分日常需要的情况下缩减工作量。下面一个示例脚本的执行结果:

   

[Administrator@PC-20121113XYVZ]#cat example.sh
echo "#This is a example shell script written to demostrate a shell interpreter named Shell4Win#" echo "Let's start with some simple commands" echo "ls can show files under current directory:" ls read "Press Enter key to continue" echo "pwd can show you current directory:" pwd read "Press Enter key to continue" echo "mkdir can make a directory,and grep can be used with pipes:" mkdir test ls|grep test echo "cd can change current directory:" cd test echo "redirection can create files:" echo "test content1"> echo "test content2"> cat cat echo "diff can be used to compare two text files:" diff [Administrator@PC-20121113XYVZ]#sh example.sh
#This is a example shell script written to demostrate a shell interpreter named Shell4Win#
Let's start with some simple commands
ls can show files under current directory:
example.sh
parser.out
parsetab.py
parsetab.pyc
ply
Shell4Win.py
tools.py
tools.pyc
utilities.py
utilities.pyc
Press Enter key to continue
pwd can show you current directory:
C:\Users\Administrator\Documents\GitHub\Shell4Win\src
Press Enter key to continue
mkdir can make a directory,and grep can be used with pipes:
Directory test created!
test
cd can change current directory:
change current directory to test
redirection can create files:
test content1
test content2
diff can be used to compare two text files:
line : test content1 test content2

后记

在这个项目之前,我最喜欢的语言是Java,现在是python!

[开源项目]Shell4Win,一个在Windows下执行shell命令的解释器的更多相关文章

  1. mysq在命令行模式下执行shell命令

    mysql可以在命令行模式下执行shell命令 mysql> help For information about MySQL products and services, visit: htt ...

  2. node.js在Linux下执行shell命令、.sh脚本

    首先,引入子进程模块 var process = require('child_process'); 执行shell命令 调用该模块暴露出来的方法exec process.exec('shutdown ...

  3. subprocess使用,进入到某个目录下执行shell命令

    subprocess是用来fork一个子进程的.这个子进程可以运行一个外部程序. 函数: subprocess.call() subprocess.check_output() subprocess. ...

  4. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

  5. Windows环境下执行hadoop命令出现Error: JAVA_HOME is incorrectly set Please update D:\SoftWare\hadoop-2.6.0\conf\hadoop-env.cmd错误的解决办法(图文详解)

    不多说,直接上干货! 导读   win下安装hadoop 大家,别小看win下的安装大数据组件和使用  玩过dubbo和disconf的朋友们,都知道,在win下安装zookeeper是经常的事   ...

  6. Windows下的cmd命令行中设置环境编码

    我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...

  7. windows下使用curl命令 && 常用curl命令

    什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...

  8. 惊艳的cygwin——Windows下的Linux命令行环境的配置和使用

    http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36  点滴之间 聚沙成金 原文  http://www.path8.net/t ...

  9. windows下使用curl命令&&常用curl命令

    什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...

随机推荐

  1. webservice之helloword(web)rs

    spring整合webservice 1.pom.xml文件 <dependencies> <!-- cxf 进行rs开发 必须导入 --> <dependency> ...

  2. POJ3181--Dollar Dayz(动态规划)

    Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. ...

  3. codeforces 879c

    C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. 用Html创建简历

    用最基本的html实现简历的创建 代码 <!doctype html> <html> <head><meta charset="utf-8" ...

  5. python之函数2

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...

  6. ASP.NET MVC Area 区域

    大型网站或项目通常有很多子系统或功能模块,如大型网站可能包含酒店.旅游.机票子系统,通过二级域名来访问,或者一个网站的前台和后台模块,每个团队负责某一子系统或模块,为了各团队进行协同开发,我们可以分不 ...

  7. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. 用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮

    在wpf中,将按钮的IsDefault设置为true ​​​​

  9. 开源 PetaPoco 扩展~一个小型轻巧的ORM~

    PetaPoco http://www.toptensoftware.com/petapoco/ |PetaPoco is a tiny, fast, single-file micro-ORM fo ...

  10. react-native项目之样式总结

    react native(以下简称rn)里面涉及到的样式规则都是在js文件中写的,一改pc端的在样式文件中定义规则,所以pc端开发习惯的童鞋转向开发rn项目时,可能会对样式感到有些奇怪:其实react ...