
之前在朋友圈求助过。如何快速制作一个CLI工具是命令行工具,比如echo。
大圈神们贡献了很多方法。我先做个总结。
比如Java语言的Spring Shell,可以和SpringBoot一起做一个命令行工具,比如下面的写法。
shellcomponentpublicsshcommandshellmethodpublicvoidssh(shell option(value = "-s ")stringghost)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中实现了所有的工具,就像一个增加自己特色的突破口。



