制作一款 CLI 工具是件有成就感的事
本文来自微信公众号:低并发编程 (ID:dibingfa),作者:闪客
之前在朋友圈求助过,如何快速制作一款 CLI 工具,就是命令行工具,比如 echo 这种。
票圈大神们贡献了一大波方法,我先进行一波总结。
比如 Java 语言的 Spring Shell,可以和 SpringBoot 一起制作一款命令行工具,比如以下写法。
@ShellComponent public class SSHCommand { @ShellMethod(value = "connect to remote server") public void ssh(@ShellOption(value = "-s") String host) { System.out.println(host); } }
即可支持一条 ssh 命令,并附带 -s 参数。
shell: ssh -s 192.168.0.3192.168.0.3
用 java 给自己做一款这样的小工具集,还是非常方便的。当然如果你不想使用 Spring,也有 JCommander 这样的工具,不依赖 Spring 套件,只不过写法就会比较丑陋。
除了 java 语言,大家推荐最多的还是 Go 语言的 Cobra 库,官网 cobra.dev 非常简洁。
具体大家去官网看吧,都是非常直观明了的 demo,非常舒服。其他的我还没有详细调研过,这里把票圈反馈都说下:
dpdk
python 的 click
C++ 的 boost
rust clap
nodejs
java common-cli 包
urfave/cli
xterm.js
cpp 的 boost
不过没有提到 C 语言的,倒是有位读者提到了 getopt 系列函数,这个是什么呢?
先不说这个函数是什么,你知道你常用的那些命令,像 echo,cp,mv 这些,都是由谁提供的么?
这些都属于 coreutils 工具类,比如 cp --version 就可以看到具体的版本信息。
既然这些 CLI 工具类都是 coreutils 里的代码,那我们看看这里的实现方式,一定是比较优雅的。
打开 coreutils 的源码,随便找个命令,比如 basename.c 找到它的 main 方法,可以看到就是使用了 getopt_long 来解析的命令行参数。
那要说实现的优雅度,我们和 coreutils 里的实现方式一样,总归是没有错的。
不过 getopt_long 具体怎么使用呢?我们 man 一下它,就可以看到非常详细的介绍,下面还有特别简单的 demo,可以直接编译运行的。
对比发现,这 demo 和 coreutils 里的用法大体结构是一样的,都是 while 循环里不断调用 getopt_long 函数解析 - 或者 -- 的参数,然后通过 switch 判断返回值 c 的值,来执行不同的操作。
同时,将 long_options 也是就 -- 参数列表放在一个数组中,使用 required_argument 表示需要参数,no_argument 表示无需参数。
这时我有个想法,如果自己实现一套 coreutils,不但能学习到使用 C 语言制作一款优雅的 CLI 工具的方法,还能对常用 shell 命令有一个深入源码式的了解,同时我们也可以改造这些命令使其具有我们自己的特性,还可以为今后增加自己的新命令打下基础。
同时,coreutils 里很多命令的底层,也是需要调用 Linux 系统库的,我们也可以对一些系统库函数有更多的了解。
一举好多的呀!开干!
coreutils 中有个特别有趣且简单的命令,yes,你在 Linux 命令行里输入 yes 按下回车,会发现它持续不断输出 y 在命令行中,非常快,就是这效果。
我是不是可以自己实现一套,并对其进行改造,让它可以输出行号,并且控制输出的时间间隔,别那么快。
说干就干,一款 dbf-yes 工具就做出来了。
它可以支持用 -n 参数表示输出行号,用 -s 参数表示时间间隔秒数,最后跟一个参数 hehe 表示要输出的字符是什么。
感觉这个学习方式还是非常不错的,涉及到的知识点不少,而且又非常有成就感,像闯关一样把 coreutils 里面的全部工具都实现一遍,增加自己的特性。
相关文章
- 25 周年纪念作,情怀拉满但诚意欠缺:《勇者斗恶龙 怪物仙境 3》
- 联想拯救者 Y700 2023 平板推送 ZUI 15.0.723 系统灰度测试:新增“USB 网络共享”,优化底部小白条
- Streacom 推出 SG10 高端被动散热机箱:可解热 600W,1300 美元
- 3D 角色扮演策略游戏《少女前线 2:追放》公测开启,安卓、iOS、PC 多端互通
- 新能源车市:价格战开局,价值战结束
- 雪天这样拍,照片更为味道
- Cybertruck:未来物种重新定义汽车
- 2022 年我国未成年网民规模突破 1.93 亿,普及率达 97.2%
- 上映 7 天,《名侦探柯南:黑铁的鱼影》内地票房破亿、豆瓣 6.6 分
- 小岛工作室推出《死亡搁浅》联名手机手柄,预计明年发售