世界头条:制作一款 CLI 工具是件有成就感的事!
2023-01-12 13:47:45 来源:程序员客栈
之前在朋友圈求助过,如何快速制作一款 CLI 工具,就是命令行工具,比如 echo 这种。
(资料图片仅供参考)
票圈大神们贡献了一大波方法,我先进行一波总结。
比如 Java 语言的 Spring Shell,可以和 SpringBoot 一起制作一款命令行工具,比如以下写法。
@ShellComponentpublicclassSSHCommand{@ShellMethod(value="connecttoremoteserver")publicvoidssh(@ShellOption(value="-s")Stringhost){System.out.println(host);}}
即可支持一条 ssh 命令,并附带 -s 参数。
shell>:ssh-s192.168.0.3192.168.0.3
用 java 给自己做一款这样的小工具集,还是非常方便的。当然如果你不想使用 Spring,也有 JCommander 这样的工具,不依赖 Spring 套件,只不过写法就会比较丑陋。
除了 java 语言,大家推荐最多的还是 Go 语言的 Cobra 库,官网 cobra.dev 非常简洁。
具体大家去官网看吧,都是非常直观明了的 demo,非常舒服。其他的我还没有详细调研过,这里把票圈反馈都说下:
dpdkpython 的 clickC++ 的 boostrust clapnodejsjava common-cli 包urfave/clixterm.jscpp 的 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 里面的全部工具都实现一遍,增加自己的特性。
后续可能考虑出一个这样的系列,通过实现一套 coreutils,讲述一大堆底层的原理和使用方式,我个人觉得这方法真心不错。
关于 dbf-yes 的源码可以在 GitHub 上找到,点击下方阅读原文就可以跳转,后续该项目会持续迭代。
为你推荐
-
世界头条:制作一款 CLI 工具是件有成就感的事!
-
国家统计局:PPI环比由涨转降,同比降幅有所收窄-焦点快看
-
中国工信部:预计2022年规模以上工业增加值同比增长3.6%
-
41岁资深女星遭热议,没得奖当场摆臭脸,翘二郎腿满脸不乐意-环球快报
-
权威快报丨平均中选价格降至900余元 口腔种植牙省际联盟集采11日在成都开标 环球速看料
-
环球微动态丨2022大理二级工伤怎么计算
-
全球快讯:中证协下发IT安全三年提升计划 行业强化监管倒逼数字安全市场爆发
-
中科院系板块1月10日涨0.49%,汉王科技领涨,主力资金净流出203.28万元-聚焦
-
万年青(000789.SZ)董事长林榕辞职|通讯
-
1月10日国内市场DBP行情趋稳
-
天天热消息:益生股份:2022年12月白羽肉鸡苗销售收入9416万元 环比下降61%
-
【天天新要闻】上海沪工: 关于对上海证券交易所问询函回复的公告
-
借去花逾期14天不还征信有什么影响_即时焦点
-
海螺新材1月10日快速回调_最新
-
全球速递!雅安普通工伤赔偿标准是什么
-
世界微动态丨急用钱放心借逾期几天会上征信?
-
今日播报!关键时刻失误机器!勇士拿什么拯救普尔?库里终于忍不住给建议
-
观速讯丨莫信“黑中介”,车驾管业务还是得自己办
-
三生三世:白浅还是原来的白浅,凤九却不再是原来的凤九了!
-
第四届“欢乐春节”中国电影节在马耳他开幕 天天微速讯
推荐内容
- 世界头条:制作一款 CLI 工具是件有成就感的事!
- 国家统计局:PPI环比由涨转降,同比降幅有所收窄-
- 中国工信部:预计2022年规模以上工业增加值同比增
- 41岁资深女星遭热议,没得奖当场摆臭脸,翘二郎腿
- 权威快报丨平均中选价格降至900余元 口腔种植牙
- 环球微动态丨2022大理二级工伤怎么计算
- 全球快讯:中证协下发IT安全三年提升计划 行业强
- 中科院系板块1月10日涨0.49%,汉王科技领涨,主力
- 万年青(000789.SZ)董事长林榕辞职|通讯
- 1月10日国内市场DBP行情趋稳
- 天天热消息:益生股份:2022年12月白羽肉鸡苗销售
- 【天天新要闻】上海沪工: 关于对上海证券交易所
- 借去花逾期14天不还征信有什么影响_即时焦点
- 海螺新材1月10日快速回调_最新
- 全球速递!雅安普通工伤赔偿标准是什么
- 世界微动态丨急用钱放心借逾期几天会上征信?
- 今日播报!关键时刻失误机器!勇士拿什么拯救普尔
- 观速讯丨莫信“黑中介”,车驾管业务还是得自己办
- 三生三世:白浅还是原来的白浅,凤九却不再是原来
- 第四届“欢乐春节”中国电影节在马耳他开幕 天天
- 逾期36年不还会不会上征信
- 美丽田园医疗健康(02373)招股第7日录孖展4.63亿港
- Jing Pulse | LVMH 市值近 3700 亿欧元;维
- 天天热讯:朗特智能股东户数下降3.00%,户均持股12
- 炬华科技(300360):公司董事会、监事会完成换届选
- 全球即时看!时报观察丨经济复苏信心增强是A股最
- 视点!2023春节返回北碚要不要隔离?
- 小家电板块1月5日涨2.15%,倍轻松领涨,主力资金
- 69到手五罐!午餐肉的江湖里,梅林必须有名字!|
- 空军航空兵某旅开展新飞行员实弹射击训练
- 今日热闻!刘璇晒“孕照”活力满分,做瑜伽不费力
- 世界动态:苹果要求供应商削减组件供应 市值较其
- 中锐股份(002374)1月4日主力资金净卖出3161.36万元
- 苏洛维金让乌克兰深陷困境,电力系统遭重创,真正
- 肇民科技:截至2022年12月30日公司股东人数为9092户
- 《有翡》堪比《仙剑奇侠传》?北大教授赞该剧有侠
- 川发龙蟒(002312):预计2023年度日常关联交易额度
- 大庆油田油气产量当量连续二十年超四千万吨-天天
- 港股异动 | 阜博集团(03738)升13% 22Q4北水加
- 宁德时代:12月30日融券卖出金额1.06亿元,占当日
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市