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 值得试。它不是那种功能堆砌的大工具,就是把"脚本交互"这一件事做好了。几行代码就能让脚本从"能用"变成"好用"。

对于团队来说,统一的交互风格也能降低脚本的学习成本。新同事看一眼就知道怎么操作,不用读文档。

用"变成"好用"。

对于团队来说,统一的交互风格也能降低脚本的学习成本。新同事看一眼就知道怎么操作,不用读文档。