惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
Y
Y Combinator Blog
IT之家
IT之家
博客园 - 聂微东
L
LangChain Blog
爱范儿
爱范儿
H
Help Net Security
GbyAI
GbyAI
F
Fortinet All Blogs
B
Blog
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
D
DataBreaches.Net
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享

博客园 - Swizard

还在被框架绑架?一文看懂“六边形架构”,让你的核心业务稳如泰山! 逐行解剖:扒开 Lovable Agent 源码,看顶级 AI 是如何“思考”与“动刀”的 还在无脑堆砌提示词?三分钟看懂 Vercel v0 价值千万的 System Prompt 底层逻辑 OpenClaw+OpenViking + NVIDIA API 配置教程 拒绝“挤牙膏”!用苏格拉底提示法,让 AI 从“复读机”进化为“咨询顾问” 告别 sudo 滥用!用 gosu 优雅解决 Docker 容器权限的“千古难题” 拒绝视觉噪音:用“数据墨水比”法则重塑你的专业图表 告别 Git Stash:用 Git Worktree 实现多任务并行,效率起飞! 手机里的 Linux 实验室:Termux 让你随时随地开启“黑客”模式 拒绝“隐形”!用 JSON-LD 让你的网页在 Google 搜索结果中“自带光环” ⚔️ Google SGE vs. Perplexity:一场内容争夺战,两套生存法则 SEO 已死?拥抱 AEO/GEO:如何让 AI 主动“推荐”你的网站 Python 重构神器:告别 ast 模块的痛苦,三行代码搞定复杂批量修改 别再手写递归找文件了!用 Python rglob 一行代码搞定海量搜索 告别笨重的 For 循环:用 xargs 打造 Linux 命令行流水线神器 告别“断网即崩溃”:像存档游戏一样管理你的终端会话(Tmux 终极入门) 沉默的观察者:Multi-Agent 架构如何实现“零指令”主动服务? 杀死那个提示词框:揭秘“意图识别 + 动态组装”的幕后逻辑 UI 设计如何落地“Boss Mode”?告别聊天框的四个交互法则 用 100 倍 Token 换取 10% 体验:关于 AI Agent 的“暴力美学”
别再写丑陋的 Shell 脚本了:用 Gum 给你的终端穿上“高定西装”
Swizard · 2026-02-12 · via 博客园 - Swizard

1. 引言:那个让人“劝退”的黑底白字

你写过(或者被迫维护过)这种 Shell 脚本吗?

echo "请输入提交类型 (fix/feat/docs):"
read TYPE
echo "请输入提交信息:"
read MSG
echo "确认提交吗?(y/n)"
read CONFIRM
if [ "$CONFIRM" != "y" ]; then exit 1; fi

痛点场景

  • 交互反人类:输错了还得重来,没有撤回键。

  • 颜值负分:纯文本堆砌,毫无重点,看着就想睡觉。

  • 容易出错:用户输入 Fixfix 还是 FIX?还得写正则去校验。

解决方案Gum。它不需要你学习 Go 或 Python,你依然在写 Bash 脚本,但每一行命令都能召唤出一个现代化的、可交互的 UI 组件(下拉框、搜索栏、加载动画)。


2. 概念拆解:Gum 是什么?

生活化类比:乐高积木 vs. 黏土

  • 传统的 Shell 脚本 就像玩黏土。你想捏个输入框,得自己用 readcase 语句一点点捏,稍微用力不对就塌了(逻辑 bug)。

  • Gum 就像乐高积木。它提供了一盒现成的、精美的零件。

    • 想要一个下拉菜单?拿一块 gum choose 积木插上去。

    • 想要一个多行文本框?拿一块 gum write 积木插上去。

    • 想要确认弹窗?拿一块 gum confirm 积木插上去。

你不需要知道积木内部怎么制造的,你只需要把它们拼在一起,就是一个漂亮的 App。


3. 动手实战:5 分钟写一个“极客版”Git 提交工具

我们来重写引言里那个丑陋的脚本。假设我们要写一个 git-commit.sh 脚本,规范团队的提交格式。

第一步:安装 Gum

# macOS / Linux (Homebrew)
brew install gum

# Arch Linux
pacman -S gum

第二步:编写脚本 (Magic Happens)

创建一个文件 better-commit.sh

#!/bin/bash

# 1. 漂亮的标题 (gum style)
gum style \
	--foreground 212 --border-foreground 212 --border double \
	--align center --width 50 --margin "1 2" --padding "2 4" \
	"Git Commit Helper" "Powered by Gum"

# 2. 选择提交类型 (gum choose)
# 用户不用打字,直接用箭头键选择,回车确认
echo "👉 选择变更类型:"
TYPE=$(gum choose "fix: 修复 Bug" "feat: 新功能" "docs: 文档更新" "style: 格式调整")

# 3. 输入提交信息 (gum input)
# 自带占位符,看起来很现代
echo "📝 简短描述:"
SCOPE=$(gum input --placeholder "例如:user-login 模块...")

# 4. 详细描述 (gum write)
# 弹出一个类似于 nano 的编辑器,支持多行输入,Ctrl+D 保存
echo "📄 详细内容 (可选,Ctrl+D 保存):"
DESCRIPTION=$(gum write --placeholder "详细描述本次变更的内容...")

# 5. 最终确认 (gum confirm)
# 漂亮的 [Yes] / [No] 按钮
gum confirm "确认提交吗?" && {
    # 6. 加载动画 (gum spin)
    # 在执行 git commit 时显示旋转动画,而不是枯燥的光标
    gum spin --spinner dot --title "正在提交代码..." -- sleep 2 
    # 这里模拟耗时,实际替换为: git commit -m "$TYPE($SCOPE): $DESCRIPTION"
    
    gum style --foreground 10 "✅ 提交成功!"
} || {
    gum style --foreground 1 "❌ 已取消。"
}

代码解析:为什么这么优雅?

  • gum choose:它是模糊搜索友好的。如果列表有 100 项,用户可以直接打字过滤,完全不用你写搜索逻辑。

  • 组合性 (Composability):注意 TYPE=$(gum choose ...) 这一行。Gum 的设计哲学是 Standard Input/Output。它把用户的选择直接吐到标准输出,你可以立即用变量接住它。

  • gum spin:这是提升体验的神器。它把“卡住不动”变成了“正在处理”,极大地缓解了用户的焦虑。


4. 进阶深潜:那些让你显得很“高级”的技巧

场景一:不仅是输入,更是“过滤器” (gum filter)

如果你有一个很长的列表(比如所有的 Docker 容器),你想选一个删掉。

  • 传统做法docker ps -> 眼睛找 ID -> docker rm <ID>

  • Gum 做法

    # 获取所有容器ID,传给 gum filter 进行模糊搜索,选中的结果传给 docker rm
    docker ps -a --format "{{.ID}}  {{.Image}}" | \
    gum filter --limit 1 --placeholder "Pick a container to kill..." | \
    awk '{print $1}' | \
    xargs docker rm

    这一行命令,直接给你生成了一个交互式的 Docker 容器管理器。

场景二:像 Markdown 一样渲染输出

脚本跑完了,想给用户看一个漂亮的总结报告?别用 echo 了。

# 它可以直接渲染 Markdown 格式
gum format \
	"# 部署报告" \
	"## 状态" \
	"- 服务 A: **运行中**" \
	"- 服务 B: **已停止**" \
	"> 请及时检查日志"

最佳实践:别忘了 Exit Code

Gum 的组件通常遵循标准:

  • 用户正常确认/输入 -> 返回 0

  • 用户按 EscCtrl+C 取消 -> 返回 1 (或 130)

所以在脚本里,善用 || exit 1 可以让流程控制非常健壮。

# 如果用户在输入框按了 Esc,脚本直接退出,不继续执行
NAME=$(gum input --placeholder "Name") || exit 1

5. 总结与延伸

Gum 不是一种新语言,它是 Shell 脚本的“美颜滤镜”。

它证明了:实用主义(Shell)和美学(UI)并不冲突。如果你正在写任何需要“人”来操作的内部工具(部署脚本、数据库迁移脚本、环境配置脚本),请务必引入 Gum。