[开源项目]Shell4Win,一个在Windows下执行shell命令的解释器
背景
顺利拿到心目中的理想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命令的解释器的更多相关文章
- mysq在命令行模式下执行shell命令
mysql可以在命令行模式下执行shell命令 mysql> help For information about MySQL products and services, visit: htt ...
- node.js在Linux下执行shell命令、.sh脚本
首先,引入子进程模块 var process = require('child_process'); 执行shell命令 调用该模块暴露出来的方法exec process.exec('shutdown ...
- subprocess使用,进入到某个目录下执行shell命令
subprocess是用来fork一个子进程的.这个子进程可以运行一个外部程序. 函数: subprocess.call() subprocess.check_output() subprocess. ...
- 在windows下使用cmd命令行对java文件进行编译和执行
windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...
- 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是经常的事 ...
- Windows下的cmd命令行中设置环境编码
我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...
- windows下使用curl命令 && 常用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...
- 惊艳的cygwin——Windows下的Linux命令行环境的配置和使用
http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36 点滴之间 聚沙成金 原文 http://www.path8.net/t ...
- windows下使用curl命令&&常用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...
随机推荐
- bzoj2938(ac自动机)
刚学了ac自动机,去hzwer上找了道练习题: 串是安全的就说明ac自动机不会找到匹配,考虑ac自动机的匹配过程: 我们把val等于1的点删掉和fail指针指向被删掉的点删掉: 如果剩下的图有环,就有 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java 是值传递
本质:传值/传地址值 以下搬运自知乎大佬 作者:Intopass链接:https://www.zhihu.com/question/31203609/answer/50992895来源:知乎著 ...
- Java Application和Java Applet的区别
Java Applet和Java Application在结构方面的主要区别表现在: (1)运行方式不同.Java Applet程序不能单独运行,它必须依附于一个用HTML语言编写的网页并嵌入其中,通 ...
- CSS 基础 例子 display属性:block、inline和inline-block的区别
HTML中块级元素(block)和行级元素(inline):比如div就是常见的块级元素,span就是常见的行级元素. 可以通过css的display属性来设置一个元素到底是块级,还是行级元素:dis ...
- 2-KNN(K最邻近算法)
KNN基本思想: 1.事先存在已经分类好的样本数据(如分别在A类.B类.C类等) 2.计算待分类的数据(叫做新数据)与所有样本数据的距离 3.选择K个与新数据距离最近的的样本,并统计这K个样本所属的分 ...
- [javascript]jsonp-function 代码段
(function($1454395832823,arr_infoList /**/) { $1454395832823.push(' '); for(var i in arr_infoList) { ...
- 在 Centos7 的KVM上启用嵌套虚拟化
1.嵌套虚拟化意味着在虚拟机内配置虚拟化环境.换句话说,我们可以说嵌套虚拟化是虚拟机管理程序hypervisor的一个特性,它允许我们通过虚拟化管理程序(宿主机)的硬件加速在虚拟服务器内安装和运行虚拟 ...
- 开发 C# OPC 客户端
编写 opc 客户端的思路 1. 使用OPC Client浏览服务器, 查看测试代码修改后的结果. 2. 根据OPC Client搜集到的服务器信息编写代码和服务器交互 3. OPC Client 操 ...
- 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
[源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...