当前位置: 首页 > news >正文

别再写丑陋的 Shell 脚本了:用 Gum 给你的终端穿上“高定西装”

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

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

Bash
 
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

Bash
 
# macOS / Linux (Homebrew)
brew install gum# Arch Linux
pacman -S gum

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

创建一个文件 better-commit.sh

Bash
 
#!/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 做法

    Bash
     
    # 获取所有容器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 了。

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

最佳实践:别忘了 Exit Code

Gum 的组件通常遵循标准:

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

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

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

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

5. 总结与延伸

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

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

http://www.jsqmd.com/news/375377/

相关文章:

  • 题解:AWC 0004
  • 修复Discuz 迁移后页面全部变成“????”乱码的问题
  • 2026最新十大知名生态板品牌推荐榜!优质环保品质与高性价比源头厂家选择指南,适配全屋定制多场景 - 品牌推荐2026
  • 彻底搞懂 Event Loop:宏任务与微任务的执行顺序全解析
  • 输入烧烤店时段客流,自动调整食材准备量,减少浪费
  • 游记:GZ ICPC2025
  • 2026激光切管十大品牌实力排名(年度十强争霸榜) - 匠言榜单
  • WPS office和WPS pdf
  • 2026年2月宁波精装改造设计公司哪家强? - 疯一样的风
  • 重磅!大数据OLAP助力智慧安防建设的关键
  • P11960 [GESP202503 五级] 平均分配 贪心+模拟
  • CQ小六竞赛生寒假悠闲的一天~~
  • 【Docker基础篇】实用CLI命令指南:run/stop/exec/logs,日常开发高频使用不踩坑
  • AI原生应用领域持续学习:构建技术知识体系的秘诀
  • 2026年2月护资模拟考试app权威推荐,界面流畅刷题更稳定 - 品牌鉴赏师
  • 【Docker基础篇】从0到1写Dockerfile:FROM/COPY/CMD/ENTRYPOINT指令详解+Hello World实战
  • 大规模语言模型的反事实推理与情景模拟
  • 2026最新十大知名全屋定制板材品牌推荐榜!优质环保品质与高性价比源头厂家选择指南,环保耐用适配多场景 - 品牌推荐2026
  • Elasticsearch 与 Cassandra 集成:处理超大规模数据
  • 深入解析:深度学习任务分类与示例(一)
  • 代码复现:深度残差收缩网络的完整Python程序代码复现:深度残差收缩网络的完整Python程序
  • LaTeX常用符号使用随笔
  • 4K/60帧+电脑反控手机?实测这款“蓝莓投屏”:延迟低至30ms,把竞品按在地上摩擦
  • 仿微信聊天软件源码深度解析:从架构设计到多端数据互通实现思路
  • 两天停PanelAI开发,突发奇想用AI写了个免费开源网址导航主题+WordPress后台
  • 市面气柜存在诸多问题,万伯双膜储气柜如何解决?
  • 基于深度学习YOLOv12的脑肿瘤识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • JAVA工具版本差异带来的困挠
  • 基于深度学习YOLOv11的草莓成熟度识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 悲壮的先知——柏拉图说了些什么