制作一款 CLI 工具是件有成就感的事!_天天报道
之前在朋友圈求助过,如何快速制作一款 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 工具是件有成就感的事!_天天报道
- 一天退货300万,YSL惹怒肖战粉丝 全球通讯
- 2023银川布衣乐队演出购票须知(附入口)|全球消息
- 广东:形成8个万亿元级产业集群 区域创新综合能力连续6年全国第一
- 洋浦申能电气风电新能源装备产业项目首台机组下线
- 通富微电:公司封测的集成电路产品应用领域广泛 其中包括AR和VR领域|天天视点
- 海峡两岸“动、植、食”系列常用产品名称及HS编码对照团体标准发布
- 港股异动 | 香港宽频涨10.8% 摩通将公司列为电讯首选股目标价升至7港元-环球快报
- 演员倪佑恩突然去世,年仅49岁,家人证实死讯,拒绝披露死因
- 终于!又一对明星夫妻宣布离婚,网友:早就该分开了...:天天播报
- 美未来通胀走向或降温 国际黄金维持涨势 世界快资讯
- 全球速读:2023西安兵马俑除夕夜开放吗
- 四会富仕(300852)1月10日主力资金净卖出165.73万元
- 焦点速看:帅丰电器(605336)1月9日主力资金净买入203.77万元
- 请问在我国诉讼离婚加急是怎么样的?
- 延吉市交通违章扣分补缴需要准备哪些资料
- 捷信超贷网贷逾期21年多久会上征信系统|环球头条
- 有钱花贷款逾期4千会不会上征信
- 热推荐:“卷王”特斯拉“杀疯了”
- 17投4中,11助1失误!哈登没那么好,但也没有那么糟糕|世界时快讯
- 快报:经典之作《你好,隔壁学霸》,超多小甜饼剧情,精彩不容错过!
- 环球滚动:比亚迪海豹搭档丹拿,「声」级出行驾趣
- 最资讯丨中邮消费金融贷款逾期49年多久会上征信系统
- 环球讯息:U系列国足纷纷集训,中国足球新年期盼新气象
- 高圆圆赵又廷离婚了?男方曝出惊天大瓜,她这次彻底完了! 环球报资讯
- 天天讯息:甄选加州西梅果干,个大饱满,酸甜软糯,一口一个超满足!
- 出口翻倍 新能源汽车目前已成为中国智能制造“新名片”
- 中来股份:高效电池项目一期首批4GW部分产线已实现量产
- 环球观热点:合肥肥西县上派镇中心卫生院有发热门诊吗?
- 昂利康: 独立董事关于相关事项的独立意见
- 阳光保险(06963):稳定价格期间结束 超额配股权失效|全球播资讯
- 当前短讯!外媒称亚马逊裁员将影响到18000多名员工
- 【券商聚焦】美银证券策略师:标普500指数太拥挤 建议买入小盘股和能源股
- 不嫩不老的上海奶奶街头风穿搭巧妙运用这3个时髦套路
- 环球焦点!高能环境蝉联“2022中国环境企业50强”
- 世界头条:知乎往返于洞穴
- 京信网络系统在新交所主板第二上市
- 1月3日63只个股获券商关注 东山精密目标涨幅达53.91%
- 中原银行(01216):贾继红辞任副监事长、职工监事等职务-全球实时
- 江苏新能(603693):江苏新能控股股东的一致行动人增持公司股份计划实施期限届满暨增持结果
- 俄罗斯传来坏消息,中俄关键项目突然生变,中方4年前早已提醒!
- 开门红!元旦三天待客1380.47万人次,河南旅游业迎来全面复苏 今日热搜
- 购置新能源汽车不再享受补贴 比亚迪等多家车企宣布涨价_世界新视野
- 观察:描写乡村柳树的句子(精选747句)
- 【世界快播报】银河电子最新公告:签署储能业务战略合作协议
- reception怎么读 reception是什么意思|环球快资讯
- 《YOLOv5全面解析教程》十三,downloads.py 详细解析
- 2022安庆一级工伤赔偿标准是什么:环球新要闻
- 电壶烧水插头要插紧吗?_环球快播
- 国盛金控(002670.SZ):中国证监会核准国盛证券恢复正常经营
- 用励志故事激励更多追梦人!《奋斗者之歌》正式出版发行!_世界快播报
- 全球播报:盛视科技:目前公司正积极推进多个海外项目,并已有部分项目在交付中
- 焦点信息:东吴国企改革主题灵活配置混合A基金经理变动:增聘赵梅玲为基金经理
- 12月29日基金净值:鹏华安康一年持有期混合A最新净值0.9863,跌0.04%-每日聚焦
X 关闭
最新资讯
- 观速讯丨2023浙江国考笔试时间安排公告
- 光明网评论员:今年春运之路怎么走:全球微动态
- 微信红包封面怎么设置
- 滴水贷逾期28年还不起会上征信系统吗
- 异动快报:卫信康(603676)12月29日10点33分触及涨停板
- 罕见!同时发布利好消息,这些上市公司受益
- 微信红包封面怎样设置?
- 独家资金:主力进散户逃前10股
- 南京止马营社区医院新冠疫苗接种情报(持续更新)
- 羊没羊,好像也没那么重要了! 每日快看
- 【时快讯】[快讯]上海港湾:上海港湾部分募集资金投资项目增加实施主体
- 异动快报:*ST中昌(600242)12月27日14点51分触及涨停板
- 速递!异动快报:*ST辅仁(600781)12月27日9点39分触及涨停板
- 每日看点!ST树业财务负责人曾繁泉辞职
- 小袋鼠网贷逾期5天多久上征信
- 天天热议:从“央视名嘴”到“滚出主持界”,董倩到底做错了什么?
- 妮可拉圣诞献吻,小贝长子秀恩爱!融入富豪家族,不陪爹妈兄妹|世界速看
- 记一次QQ找回经历
- 年终经济观察:外需走弱,2023年中国外贸如何解压?
- 全球热门:存机油起火隐患!宝马召回498辆摩托车
- 广州队vs国安首发:国安张玉宁领衔 广州全U23出战
- 世联行:12月22日获融资买入1172.67万元,占当日流入资金比例8.02%:焦点快看
- 淮北二手房违约律师费用怎么算
- 世界今热点:双非本科到大厂,贫困家庭到深圳买房,我的逆袭之路
- 数据港(603881)12月21日主力资金净卖出2136.23万元:环球速看料
- 天天即时看!“太阳地球工程”:让太阳光变暗给地球降温?
- 如何在众多综艺中“脱颖而出”?
- 热资讯!假“米小圈”牵出特大盗印图书团伙 涉案金额1.04亿元
- 当前焦点!信立泰(002294.SZ):创新小分子药物SAL0133片临床试验申请获得受理
- 业务流程建模,细到几层?
- 环球热讯:这个波卡钱包可以让你玩转 NFT、XCM、Staking 和 Crowdloan|SubWallet 钱包体验报告
- [快讯]中牧股份:中牧实业股份有限公司关于减持公司所持其他上市公司部分股份
- 港股上市首日破发市值较估值缩水六成 “辣条一哥”卫龙不“香了”
- 太康县召开优化政务环境暨重点项目联审联批工作会议:世界动态
- 当前通讯!韩国今年前11月电影产业累计销售额超1万亿韩元 同比增加100.5%
- 资讯推荐:专访|佑安医院李侗曾:感染后半年内通常不会再次感染
- 鸽子多久喂一次盐 多长时间喂一次鸽子盐:今日快讯
- 天天快看点丨房产再婚协议书怎么写?
- 上汽大通推出首款搭载9AT变速箱新车型 大通轻客海外出口超5万辆_今日热议
- 世界最新:安道麦B: 关于关联方5000万美元信用贷款暨关联交易的公告(英文版)
- 焦点!12月15日格力地产涨停分析:横琴新区,核酸采样,房地产概念热股
- 国际医学:公司旗下西安佑君医疗信息有限公司聚焦信息系统集成、大数据、云计算平台建设、计算机软硬件及辅助设备、人工智能产品于一体:每日资讯
- “黄橙子”大学篇?田曦薇新剧开播,《初次爱你》校园甜宠剧上线-焦点讯息
- 护好“菜篮子” 洛龙区各保供商超供应充足|天天观速讯
- 全球观热点:宁波韵升:12月13日获融资买入2541.52万元,占当日流入资金比例14.35%
- 【世界时快讯】55亿!格力电器净利一半拿来分红,董明珠或入袋4000万
- 锋尚文化:截至12月9日公司股东人数为11,666人
- 当前信息:帝欧家居: 关于控股股东协议转让部分股份的提示性公告
- 当前观察:中国电信助力解决老年人“数字鸿沟”难题,为老年生活增添“温度”
- 三超新材: 南京三超新材料股份有限公司2022年限制性股票激励计划(草案修订稿)
X 关闭