ani-cli 源码解析(一):670 行 POSIX Shell 如何构建一个完整 CLI 应用

发布时间:2026/9/19 14:04:10
ani-cli 源码解析(一):670 行 POSIX Shell 如何构建一个完整 CLI 应用 ani-cli 源码解析一670 行 POSIX Shell 如何构建一个完整 CLI 应用【免费下载链接】ani-cliA cli tool to browse and play anime项目地址: https://gitcode.com/gh_mirrors/an/ani-cliani-cli 是一个在终端里搜索、播放和下载动漫anime的命令行工具它没有依赖任何框架整个应用就是一个 670 行的 POSIX Shell 脚本。本文将从源码结构、参数解析、抓取流程和跨平台适配四个角度带你拆解这个极简但完整的 Shell CLI 应用是如何写出来的。一个文件就是一个完整 CLI 应用传统观点认为做一个像样的 CLI 需要选语言、选框架、管依赖。ani-cli 打破了这个印象——整个项目主体就是这一个可执行脚本主程序ani-cli670 行#!/bin/sh开头兼容 POSIX sh手册页ani-cli.1Homebrew 配方Formula/ani-cli.rb二次开发指南hacking.md想本地跑起来的话git clone https://gitcode.com/gh_mirrors/an/ani-cli sudo cp ani-cli/ani-cli /usr/local/bin 为什么坚持 POSIX Shell答案在 CONTRIBUTING.md 里项目要求通过shfmt与shellcheck -s sh严格 POSIX 模式检查并且明确写着No extra dependencies unless absolutely necessary。极小的体积带来一个巨大好处——随处可跑Linux、macOS、Windows (Git Bash/WSL)、Android Termux、iOS iSH、Steam Deck甚至 FreeBSD。快速总览670 行的功能分区打开 ani-cli 你会发现它按注释被清晰地切成了六大区块这是阅读长脚本最好的地图区块行号范围职责# UIani-cli#L5-L44交互菜单、彩色输出、帮助信息# Bookkeepingani-cli#L108-L148自动更新、依赖检查、清理# SCRAPINGani-cli#L150-L308搜索、剧集列表、m3u8 解密# HISTORYani-cli#L310-L340观看历史续看功能的数据基础# PLAYINGani-cli#L342-L437多播放器适配、分集播放# MAINani-cli#L439-L670全局配置、参数解析、主流程项目官方文档 hacking.md 甚至为整套交互设计了一张状态机式的 UX 规格图搜索 → 选片 → 选集 → 播放 → 后菜单的完整闭环一目了然命令行参数解析一个 while case 搞定所有选项很多语言需要引入 argparse、clap 这类库Shell 的标准答案是while循环 case模式匹配。ani-cli#L492-L560 用一个约 70 行的解析循环覆盖了全部 17 个选项while [ $# -gt 0 ]; do case $1 in -q | --quality) quality$2; shift ;; -c | --continue) sourcehistory ;; ... *) query...$1 ;; # 非选项参数拼成搜索词 esac shift done几个值得学习的设计长短选项等价-q | --quality写在同一个分支里零成本支持两种风格位置无关[ $# -lt 2 ] die missing argument!对带参数的选项做校验让用户可以把选项放在查询词前后帮助信息里明确承诺了这一点见 ani-cli#L48-L51剩余参数即查询*)分支把所有非选项参数合并成一个查询字符串空格转天然实现多词搜索无框架的 help/version-h输出由printf模板生成ani-cli#L46-L101-V直接读第 3 行的version_number变量——版本号只有一处定义自更新时靠sed提取它ani-cli#L113保证全局一致。 这种case 表驱动的写法是所有 Shell CLI 项目最值得照抄的参数解析范式。交互菜单三层抽象让 fzf / rofi / dmenu 互换ani-cli 的交互核心是两个函数menu()ani-cli#L9-L16按menu_program分发到 fzf / rofi / dmenu 或任意自定义程序每个后端的参数差异被压缩进一个casenth()ani-cli#L19-L35接收序号 Tab 数据格式的标准输入让用户选一行或一段范围再统一切出结果字段。整个 UI 层因此与具体菜单程序解耦环境变量ANI_CLI_MENU、命令行--rofi/--dmenu都能切换甚至连非终端环境如管道调用都会自动降级到 dmenuani-cli#L479-L482。播放结束后还有后菜单循环ani-cli#L635-L653next / replay / previous / select / change_quality / quit同样复用nth()一行代码都不用重写。抓取流程从搜索词到 m3u8 的四步管道hacking.md 里有一张官方流程图概括了 ani-cli 作为爬虫的完整链路对应到代码每一步都是一个小函数 sed 正则的组合搜索ani-cli#L199-L210 请求搜索页后用三级sed管道把 HTML 压平、按film-detail切块、抽取id \t 标题剧集列表ani-cli#L213-L219 从剧集页抽出id \t 集数取流地址ani-cli#L222-L242 是最硬核的一步——内嵌播放器把配置做成了base64(json XOR 密钥)deobfuscate_blob() 用od取字节、在子 shell 里逐字节异或还原出 JSON再从中抠出 m3u8 地址和字幕选清晰度select_quality() 按best/worst/1080等规则从分辨率 URL列表里挑一条。 值得注意的是防封处理hianime_curl() 封装了带超时的 curl检查 HTTP 状态码并识别 Cloudflare 的Just a moment拦截页curl 本身也会按curl_firefox135 → curl_chrome136 → … → curl的顺序自动降级选择dep_ch_failover普通用户无感。跨平台适配与自更新Shell 项目的两个硬骨头平台差异用一个uname分发集中解决ani-cli#L457-L469macOS默认播放器 IINAApple 上 mpv 的友好替代Android (Termux)android_mpv走am start拉起 mpv 应用referrer 通过共享配置文件传递ani-cli#L355-L362Windows/WSL直接用mpv.exeiOS (iSH)输出 OSC8 超链接点一下在 VLC 打开ani-cli#L399-L402Linuxmpv → flatpak mpv → vlc 逐级回退。而play_episode()里那段按播放器分发的caseani-cli#L371-L404则展示了另一个技巧不同播放器传参风格完全不同mpv 用--sub-file、VLC 用:input-slave、IINA 要转义冒号统一收口在一个函数里按名字模式匹配分派比抽象类更Shell。自更新则是 Shell 圈的经典骚操作-U拉取远端脚本 →diff对比自己$0→ 用patch原地修补update_script()。没有包管理器、没有下载器脚本自己给自己打补丁。写在前面这套写法能学到什么ani-cli 证明了 Shell 不是临时脚本语言清晰的区块注释、单一数据格式id \t name贯穿全链路、case表驱动、failover 依赖探测、trap清理ani-cli#L581这些模式组合起来就是一个可维护的完整应用。如果你也想改它的抓取逻辑或移植到新站点建议从官方指南 hacking.md 入手其中给出了搜索页、剧集页、播放器三处改造的完整方法论而 ani-cli.1 则是一份适合快速查选项的手册页。下一篇我们计划深入deobfuscate_blob()的异或解密细节与观看历史系统敬请期待。【免费下载链接】ani-cliA cli tool to browse and play anime项目地址: https://gitcode.com/gh_mirrors/an/ani-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询