之前在朋友圈求助过如何快速制作一个CLI工具是命令行工具,比如echo
大圈神们贡献了很多方法我先做个总结
比如Java语言的Spring Shell,可以和SpringBoot一起做一个命令行工具,比如下面的写法。
shellcomponentpublicsshcommandshellmethodpublicvoidsshstringghost)system . out . println(host),
您可以使用—s参数支持ssh命令。
shell:ssh—s 192 . 168 . 0 . 3192 . 168 . 0 . 3
用java给自己做这么一个小工具集,非常方便当然,如果你不想用Spring,也有JCommander之类的工具,不依赖Spring套件,但是写出来会很难看
dpdk
python的点击
C++ boost
锈斑
nodejs
通用CLI包
urfave/cli
xterm.js
cpp的增强
不过没有提到C语言,倒是有读者提到了getopt系列函数这是什么
不管这个函数是什么,你知道你常用的echo,cp,mv这些命令是谁提供的吗。
这些都属于coreutils工具类,比如cp — version,具体版本信息可以看。
由于这些CLI工具类都是coreutils中的代码,所以我们来看看这里的实现,它必须是优雅的。
打开coreutils的源代码,找到任意命令,比如basename.c找到它的main方法如您所见,getopt_long解析的是命令行参数
说到实现的优雅,我们和coreutils里的实现是一样的,总没有错。
但是如何使用getopt_long呢伙计,我们看的时候可以看到非常详细的介绍下面还有一个特别简单的演示,可以直接编译运行
通过对比发现,这个demo的大体结构和coreutils中的一样两者都是在while循环中连续调用getopt_long函数来解析—or—参数,然后通过开关判断返回值C的值来执行不同的运算
同时,将long_options—parameter列表放在一个数组中,用required_argument表示需要的参数,用no_argument表示没有参数。
这时,我有了一个想法如果我自己实现一套coreutils,不仅可以学习如何用C语言制作一个优雅的CLI工具,还可以对常见的shell命令有深入的了解同时,我们可以将这些命令转换为具有自己的特点,并为将来添加自己的新命令奠定基础
同时coreutils中很多命令的底层也需要调用Linux系统库,我们可以多了解一些系统库函数。
真多!操!
coreutils中有一个特别有趣且简单的命令是的,如果你在Linux命令行输入yes,回车,你会发现它在命令行连续输出y,速度非常快就是这个效果
能不能自己实现一个,修改一下,让它输出行号,控制输出时间间隔,没那么快。
只要这样做,一个dbf—yes工具就做好了。
它可以支持—n参数来指示输出行号,—s参数来指示时间间隔秒数,最后还有一个参数hehe来指示要输出什么字符。
感觉这种学习方法还是很好的,涉及到很多知识点,很有成就感我在coreutils中实现了所有的工具,就像一个增加自己特色的突破口
。