Gum:让 Shell 脚本拥有交互界面
文章目录
- Gum:让 Shell 脚本拥有交互界面
- 能干什么
- 实际用起来什么样
- 定制化程度高
- 安装和使用
- 适合谁
Gum:让 Shell 脚本拥有交互界面
写 Shell 脚本最头疼的是什么?不是逻辑,是交互。你想让用户选个选项、输个密码、确认个操作,要么用 read 凑合,要么弹个丑陋的默认提示。Gum 这个工具就是来解决这个问题的。
Gum 来自 Charm 团队,Go 语言写的,Star 数已经到了 2.4 万。它的定位很明确:给 Shell 脚本加上好看的交互组件,不用写一行 Go 代码。
能干什么
Gum 提供了十几个子命令,覆盖了脚本交互的常见场景:
选择类:choose让用户从列表里选一个或多个,filter支持模糊搜索过滤,file弹出文件树让你挑文件。
输入类:input单行输入,支持密码模式;write多行文本输入,Ctrl+D 结束。
确认类:confirm弹个确认框,返回 0 或 1,直接接&&就行。
展示类:style给文字加颜色、边框、对齐;join横向或纵向拼接文本块;pager带行号的滚动查看;table渲染表格数据;spin跑命令时显示加载动画;log带级别的日志输出;format解析 Markdown 和 Emoji。
实际用起来什么样
拿提交代码举例。以前写 commit message 就是git commit -m "fix bug",现在用 Gum 可以这样:
TYPE=$(gum choose"fix""feat""docs""style""refactor""test""chore")SCOPE=$(gum input--placeholder"scope")SUMMARY=$(gum input--value"$TYPE$SCOPE: "--placeholder"Summary")DESC=$(gumwrite--placeholder"Details")gum confirm"Commit?"&&gitcommit-m"$SUMMARY"-m"$DESC"每一步都有清晰的交互提示,用户知道该干什么。整个过程从原来的盲打变成了引导式操作。
类似的场景很多:从 git 历史里挑 commit、从 tmux 会话里选一个连接、批量卸载 brew 包、清理 git 分支,都能用几行 Gum 命令搞定。
定制化程度高
每个命令都支持两种定制方式:命令行 flag 和环境变量。颜色、宽度、提示符、占位符、边框样式都能调。比如:
gum input--cursor.foreground"#FF0"--prompt"* "--width80--placeholder"What's up?"或者用环境变量设默认值,flag 还能覆盖环境变量。这对写 dotfile alias 特别有用,同一个脚本在不同环境可以有不同的默认样式。
安装和使用
主流平台都支持。macOS 和 Linux 用 brew,Arch 用 pacman,Fedora 用 dnf,Windows 用 winget 或 scoop,也能直接go install。装完就是一个gum命令,没有任何依赖。
Gum 底层用的是 Charm 自己的 Bubbles(TUI 组件库)和 Lip Gloss(样式库),这两个库在 Go 的 TUI 生态里口碑不错。Gum 把它们的能力包装成了命令行工具,普通脚本也能用上。
适合谁
如果你写 Shell 脚本、管 dotfile、做终端工作流,Gum 值得试。它不是那种功能堆砌的大工具,就是把"脚本交互"这一件事做好了。几行代码就能让脚本从"能用"变成"好用"。
对于团队来说,统一的交互风格也能降低脚本的学习成本。新同事看一眼就知道怎么操作,不用读文档。
用"变成"好用"。
对于团队来说,统一的交互风格也能降低脚本的学习成本。新同事看一眼就知道怎么操作,不用读文档。