一、前言
rust语言目前应用最广的方向之一就是命令行了,因为rust语言代码简练、内存安全、效率很高,用来开发命令行工具是非常合适的。
目前已经有相当多的命令行工具都在采用rust重写了。
二、认识命令行
命令行程序与图形化程序相对,简写分别为:CLI
与GUI
,这两个单词相信大家以后会经常看到的,其指代的分别是这两者,官方点的称谓分别为:命令行接口(command-line interface)、图形用户接口(Graphical User Interface)。
图形化程序应该是大家最早认识到的,比如QQ、微信等应用程序都是图形化界面。
而命令行则比较少见了,但只要你写过基本的C/C++程序、乃至本系列文章中的rust程序,其实也算是认识了,因为我们目前写的这些程序也都算是命令行程序。
唯一的不同之处在于,我们这些程序是点击即运行,而无法像那些看起来很专业的工具还有一大堆说明、参数等等。
而这就是本文的核心,带大家快速开发一个属于自己的命令行工具。
一个命令行工具说简单也简单,但说复杂有时也挺复杂的,比如就拿大家最熟悉的Windows系统为例,打开其终端,输入命令dir
,它就会列出当前目录下所有的文件:
这是它的默认行为,但其实它是可以带选项的,windows系统自带的命令选项是一/
开头,但主流的命令行工具都是以-
开头,这里先以windows系统的dir命令为例:
window系统自带的命令都有一个?
的选项,它会列举出该命令的使用文档,比如上图中就可以看到,除了?
外,还有相当多/
开头的选项,通过传入不同的选项就可以启用这个命令行工具的不同功能。
只要是在[]
中的选项,那就都是可选的,也就是可以不填。
但有些命令不行,比如创建目录的mkdir
命令,它需要“参数”,注意这里的用词,不再是“选项”了,而是“参数”。
参数便是不以/
或-
开头的数据:
比如上图中,直接使用mkdir
命令就不行了,通过查看其帮助文档,发现其命令后面跟着一个path
,它没有用/
开头,说明它是一个参数,并且它没有被[]
包括起来,说明它是必须要传入的数据。
虽然命令行工具可以有很大的自由度,你怎么搞都行,但如果想要让自己的命令行工具能够被广泛应用,那最好还是参考这些大家都统一遵守的原则,这样就可以为用户减少一些学习成本。
通过以上的观察我们可以发现,一个命令行工具一般是需要包含以下三部分的:
- 选项:通过
/
或者-
开头,用于启动命令行工具的不同功能 - 参数:一般直接跟着后面
- 帮助文档:一般通过固有的参数
/?
、-h
或--help
来输入当前工具的帮助文档。
不同部分都是直接用空格隔开的,但如果有些参数内部存在空格,比如路径,那你就需要用引号""
将该参数包裹起来。
而选项内又有所区别,分为短选项与长选项,比如前面提到的-h
与--help
一般就是实现同一个功能的两个选项。