• 首页
  • 粮食
  • 蔬菜
  • 果品
  • 水产
  • 酒水
  • 饮料
  • 茶叶
  • 畜禽
  • 食用油
  • 资讯
logo
  • 首页>
  • 粮食 >
  • 正文

当前讯息:制作一款 CLI 工具是件有成就感的事!

2023-01-13 03:39:20 来源:程序员客栈

之前在朋友圈求助过,如何快速制作一款 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 上找到,点击下方阅读原文就可以跳转,后续该项目会持续迭代。

关键词: 参数表示 时间间隔 真心不错

    为您推荐

  • 商务部:上周食用农产品价格上涨4.3% 猪肉批发价涨9.7%

    资讯2021-10-27
  • 商务部:上周生产资料价格上涨5% 煤炭继续领涨

    资讯2021-10-27
  • 美术作品中的党史 | 第61集《1978年11月24日·小岗》

    资讯2021-10-27
  • 31省份累计报告接种新冠病毒疫苗224868.8万剂次

    资讯2021-10-27
  • 草原都市呼和浩特战疫记:民众做好防控,生活未受冲击

    资讯2021-10-27
  • 恭城:做大做强地理标志产品,“农旅融合”助推乡村振兴

    资讯2021-10-27
  • 安徽:5年来追回外逃人员183人

    资讯2021-10-27
  • 第十三届中国舞蹈“荷花奖”民族民间舞评奖活动开幕

    资讯2021-10-27
  • 甘肃兰州统一安排中小学线上教学 各学校“停课不停学”

    资讯2021-10-27
  • 内蒙古包头发生多车连撞事故 已致5死11伤

    资讯2021-10-27
  • 商务部:上周猪肉消费明显回升 零售价格止跌上扬

    资讯2021-10-27
  • 全方位提高供给质量 推动食品产业高质量发展

    资讯2021-10-27
  • 坚持“六大保障” 构建超大城市食品安全社会共治新格局

    资讯2021-10-27
  • 17部门联合发文 推进国家文化出口基地提质扩容增效

    资讯2021-10-27
  • 俄卡马河畔切尔尼市一住宅楼天然气爆炸 5人伤亡

    资讯2021-10-27
  • 国家中小企业发展基金与全国股转公司、北交所签署战略合作协议

    资讯2021-10-27
  • 网易云课堂引进亚马逊AWS近百门IT类课程 向社会免费开放

    资讯2021-10-27
  • 冰雪之约 中国之邀|北京冬奥会倒计时100天,我们准备好了!

    粮食2021-10-27
  • 第38届和第39届东盟峰会在文莱开幕

    粮食2021-10-27
  • 高德车道级导航正式发布 覆盖全国超120个城市高速和快速路

    粮食2021-10-27

果品

  • 知识 LOL智慧末刃有什么用
  • 知识 北京国家大剧院有什么美誉
  • 北京2022年冬奥会、冬残奥会奖牌“同心”正式发布
  • 冬奥故事会丨一图了解冬奥会历届奖牌
  • 同心筑梦向未来——写在北京冬奥会开幕倒计时100天之际

蔬菜

  • 文化 意字开头的成语
  • 知识 二世祖和三世祖是什么意思
  • 说好“一梯一户”却成了“两梯两户”,买方能否解除合同?
  • 更高水平开放合作助力中国东盟经贸发展迎新机遇
  • 9被告人犯侵犯著作权罪被判刑罚
  • 玉渊谭天丨中美再通话,“建设性”很重要
  • 环球时报社评:中美经贸需要建设性对话
  • 俄媒:莫斯科扩大新冠感染新疗法试点范围
  • 冰雪之约 中国之邀 | 追赶的勇气
  • 中国第20批赴黎维和建筑工兵分队完成“VA-2”道路排水系统修缮任务

亚洲糖酒网 亚洲糖酒网 版权所有 联系邮箱:553 138 779@qq.com 备案号:京ICP备2021034106号-51

Copyright ? 1998-2015 by www.tangjiu.yzbytv.com all rights reserved