千家信息网

制作一款 CLI 工具是件有成就感的事

发表于:2026-11-06 作者:千家信息网编辑
千家信息网最后更新 2026年11月06日,本文来自微信公众号:低并发编程 (ID:dibingfa),作者:闪客之前在朋友圈求助过,如何快速制作一款 CLI 工具,就是命令行工具,比如 echo 这种。票圈大神们贡献了一大波方法,我先进行一波
千家信息网最后更新 2026年11月06日制作一款 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 里面的全部工具都实现一遍,增加自己的特性。

命令 工具 参数 语言 输出 函数 制作 优雅 同时 就是 方式 方法 还是 不断 写法 常用 时间 源码 特性 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 广州淘业互联网络科技 中国互联网科技工作委员会毛军 互联网科技行业发展 互联网科技公司的优势 互联网属科技 互联网与未来科技 互联网科技上市公司 互联网 科技服务平台 四个字互联网科技公司取名 互联网科技公司的市场部门 江苏南京365互联网科技 互联网新科技动漫ppt素材 互联网科技快讯热点 宇信科技在杭州互联网排第几 互联网金融运营模式中的金融科技 长沙渺峰互联网科技有限公司 长沙易易互联网科技有限公司 河南商务圈互联网科技有限公司 互联网科技快速发展优美句子 百单网互联网科技有限公司怎么样 科技赋能下的互联网金融 互联网科技ppt模板 山东吉时兔互联网科技有限公司 互联网时代科技改变生活 互联网经济与金融科技 华夏互联网科技业 晓花互联网科技有限公司网址 图游互联网科技 北京瑞云互联网科技有限公司
0