
1. AI 时代选命令行工具到底是在选什么作为一个常年泡在终端里的人这两年 AI 浪潮涌过来的时候我最大的感受不是“图形界面又要被颠覆了”而是命令行工具集体焕发了第二春。很多人以为 AI 时代意味着什么都能用聊天窗口解决结果真上手之后才发现越是接近底层、越是高效的操作越离不开那一个个没有界面的小命令。AI 时代的命令行工具本质上解决的是三类问题第一类是让 AI 直接参与到你的工作流里比如写代码、改代码、跑脚本第二类是让你和本地或远程的 AI 服务高效打交道拉起模型、测试接口、处理返回结果第三类是把手头零散的素材变成 AI 能消费的格式比如下载视频、提取音频、整理文本。这篇文章要聊的 5 个工具就是在这三个维度里我实测下来真正离不开的。这 5 个工具分别是 aider、ollama、jq、fzf 和 yt-dlp。别被名字吓到它们的使用思路都很直接而且互相之间能组成一套完整的工作流。你不需要一次性全装上按需取用就行。但我建议你先通读一遍因为这套组合拳用熟了之后很多看起来要折腾半天的活在终端里几行命令就搞定了。适合谁来参考只要你平时会碰终端或者正在学 AI 应用开发又或者想用 AI 提高日常工作效率但不想被各种花哨的网页工具绑架这篇文章都能给你一些可以立刻上手的思路。我会把每个工具的实际场景、常用参数、踩过的坑全都摊开讲不是那种“安装一下然后 Hello World”的入门文。2. 为什么偏偏是这 5 个工具先说为什么不是别的。AI 领域的命令行工具现在多得吓人有做 prompt 管理的有做模型路由的有做向量检索的各家的 CLI 层出不穷。但我的选择标准只有一个是否处在我每天高频操作的关键路径上。工具再多如果一周用不上一次没必要花时间学。这 5 个工具恰好覆盖了我个人频率最高的几类操作。2.1 从选型逻辑看 AI 时代的终端价值很多人会有疑问AI 不是应该让操作更简单吗为什么还要学命令行这个问题我认真想过。答案是AI 把“复杂逻辑”的部分接管了但“精确控制”的部分仍然需要你亲手完成。图形界面适合探索和展示但它的操作路径是固定的你能点的按钮就那么多。而终端里每一行命令都是一个可组合的积木你可以把 A 工具的输出接到 B 工具的输入再让 AI 来处理中间那一段。这种“管道式”的工作方式恰恰是 AI 时代的核心生产力——因为 AI 本身也是输入输出模型命令行天然适合做它的数据管道。举一个最简单的例子。你想让本地大模型总结一个网页内容在网页工具里可能要点开一个对话框复制粘贴内容还可能受限于文本长度。但在命令行里你一条命令抓取网页正文清理 HTML 标签把纯文本喂给模型模型输出的总结再通过管道送到你的笔记文件里。整个过程可以写成一个脚本反复复用不用一次又一次地打开网页界面。这 5 个工具里jq 负责处理结构化数据fzf 负责快速定位和选择yt-dlp 负责获取多媒体素材ollama 负责本地模型推理aider 负责让 AI 直接参与编码。它们相互之间不重叠又能在管道里完美配合。这就是选型逻辑的核心——不是收集一堆工具而是搭出一条高效的流水线。2.2 每个工具解决什么问题我先把这 5 个工具的作用串起来讲一遍后面再逐个展开实操。aider 是 AI 结对编程工具你直接在终端里启动它用自然语言告诉它要改哪里、怎么改它会直接修改你的代码文件并生成提交记录。和 ChatGPT 网页版的本质区别是aider 能直接操作你本地仓库里的文件不只是给你一段代码让你自己粘贴。ollama 是本地大模型运行器一条命令就能拉取并运行各种开源模型比如 Llama、Qwen、Mistral。它对没有 GPU 的机器也很友好CPU 也能跑小尺寸模型。你不需要把数据交给云端本地就能完成推理。jq 是 JSON 数据处理神器。AI 时代几乎所有接口返回都是 JSON而 jq 能让你在命令行里像 SQL 一样筛选、转换、抽取 JSON 数据。没有它你在终端里看接口返回会疯掉。fzf 是模糊查找工具它不是一个 AI 工具但它是 AI 时代最值得装的效率工具。你的历史命令、文件列表、甚至任意文本流都可以用 fzf 做交互式模糊搜索配合终端和编辑器堪称神器。yt-dlp 是音视频下载工具支持上千个站点。在大模型时代它是喂素材的利器。你想让 AI 分析一段视频内容先用 yt-dlp 把视频拉下来再用其他工具转成音频和字幕最后喂给模型处理。这个组合的完整工作流我能想到的场景太多了让 AI 分析一段视频课程的内容、让 aider 按你的要求写一个数据处理脚本、用 ollama 离线跑一个分类模型、用 jq 调试接口、用 fzf 快速找到你要编辑的文件。接下来我把每个工具的实际用法和我的经验全部倒出来。3. 五个工具逐个拆解安装配置、核心用法与避坑指南这 5 个工具我都是重度使用过的每个都会讲清楚安装方式、核心操作、关键参数以及那些不试几次绝对发现不了的坑。这些都是可以直接抄作业的内容。3.1 aider让 AI 坐在你的终端里结对编程aider 是我最近一年使用频率最高的 AI 编程工具没有之一。它的工作方式很简单你在终端里运行 aider指定一个代码仓库目录然后在交互界面里用自然语言描述你的需求它就能读取代码、分析上下文、修改文件完成之后运行测试甚至帮你生成 git commit。安装非常直接python -m pip install aider-chat如果你用的是 macOS也可以用 Homebrewbrew install aider第一次启动需要配置 API Key。aider 支持多种模型我最早用的是 OpenAI 的 GPT-4o后来也用 Claude 系列。启动命令可以带上模型参数aider --model gpt-4o进入交互界面后你会看到类似普通聊天窗口的提示符。但你需要注意aider 并不会自动读取你仓库里的所有文件它需要你主动把文件加入“上下文”。这个设计很关键——小模型有上下文窗口限制文件塞太多反而影响效果。操作方式是在提示符里用/add命令/add src/main.py src/utils.py你也可以不加参数直接运行/add它就会列出当前目录下的文件让你用回车键选择。我自己的使用习惯是每有一次改动需求先把相关文件加进来描述需求等它改完后用/diff查看改动确认无误后让它/commit提交。它的自动提交功能很有用每个改动都有清晰记录出了岔子可以直接回滚。这里有一个非常重要的实测心得aider 对模型的指令遵循能力要求很高。如果代码改动特别复杂的建议先给模型一个整体计划的要求然后分步骤执行。比如你可以先写一句“先用中文列出修改计划等我说开始再动手”这样 AI 不会一股脑往下冲。还有一个常见误区是很多人把 aider 当成 ChatGPT 网页版用以为可以问各种无关问题。其实它专注的是代码改动你问它“帮我写首诗”它当然会做但那不是它的核心价值。你真正应该让它做的是枯燥的机械重构、批量替换、测试补全、报错修复这些活。踩过的坑也提醒一下如果仓库里文件特别多启动 aider 时它会做一个简单的索引首次启动可能稍慢。另外如果你的代码库里有大量二进制文件或者巨大的依赖目录aider 会因为文件观察器扫描内容太多而变慢建议在项目根目录配置一个.aiderignore文件把构建产物、依赖目录、资源文件都排除掉跟.gitignore写法一模一样。3.2 ollama一条命令跑起本地大模型本地大模型这四五年经历了一个从“完全不可用”到“勉强能用”再到“真香”的过程而 ollama 就是那个把“真香”变成现实的工具。它对标的是 Docker 的使用体验——你不需要关心模型文件放在哪、依赖怎么装、服务怎么起几条命令就完事。安装也不复杂。macOS 和 Windows 都有图形安装包Linux 一条命令curl -fsSL https://ollama.com/install.sh | sh装完之后拉一个模型试试ollama run qwen2.5:7b这个命令会先下载 Qwen2.5 7B 模型大概 4.7GB 左右下载完成后自动进入交互式对话界面。你可以直接在里面问问题就像跟 ChatGPT 聊天一样。但注意这是一个完全本地运行的模型你的数据不出本机这一点在敏感数据处理场景里是巨大的优势。ollama 的核心命令我整理一下ollama list查看本机已有的模型ollama pull llama3.1只下载模型不进入对话ollama rm llama3.1删除模型ollama serve启动后台 API 服务ollama ps查看当前模型中加载的内存占用情况这里重点说一下ollama serve。运行它之后你的本机就有了一个 OpenAI 兼容的 API 接口默认地址是http://localhost:11434。这意味着你可以用任何 OpenAI SDK 的代码去调用本地模型只需要改一下 base_urlfrom openai import OpenAI client OpenAI( base_urlhttp://localhost:11434/v1, api_keyollama ) response client.chat.completions.create( modelqwen2.5:7b, messages[{role: user, content: 你好}] ) print(response.choices[0].message.content)这个兼容性设计非常聪明它让本地模型直接融入了现有的 AI 应用生态你不需要写额外的适配代码。实际生产中我遇到过一个问题默认情况下 ollama 加载模型会尽可能吃满内存如果你的机器同时要跑其他程序可能会卡顿。解决办法是设置环境变量控制并发数和上下文长度。比如只让一个模型占 8GB 内存OLLAMA_MAX_LOADED_MODELS1 ollama serve提示一下小显存的机器不要盲目拉 70B 这种大模型。以我个人经验8GB 显存跑 7B 量化模型比较流畅16GB 显存可以尝试 13B 模型。CPU 跑也不是不行就是速度慢一些我用 M1 Pro 的 MacBook 跑 7B 模型每秒能输出大概 8 到 10 个 token用来做离线的小规模推理完全够用。3.3 jq终端里的 JSON 手术刀如果你经常跟 API 打交道jq 就是那个能救命的东西。AI 时代所有模型接口返回的都是 JSON而 jq 能让你在命令行里优雅地筛选和转换这些数据。安装很省事# macOS brew install jq # Debian/Ubuntu apt install jq # Windows 可以用 winget winget install jq假设你调用一个 AI 接口返回的数据长这样{ choices: [ { message: { role: assistant, content: 你好我是 AI助手 }, finish_reason: stop } ], usage: { prompt_tokens: 20, completion_tokens: 8, total_tokens: 28 } }你想直接拿到 content 字段可以这样cat response.json | jq -r .choices[0].message.content输出就是纯文本的“你好我是 AI助手”没有任何多余的 JSON 包装。-r参数很关键意思是 raw output不带引号输出原始字符串。jq 的过滤语法学起来有点像 JavaScript 里的对象访问不用怕常用的就那么几个.field取字段.[]遍历数组.a.b嵌套取值select(.score 0.8)条件过滤map(.name)对数组每个元素做映射举一个组合使用的例子。假设有个接口返回了一批用户数据你想快速找出所有评分大于 0.9 的条目并且只要 id 和 namecat data.json | jq .[] | select(.score 0.9) | {id, name}这个命令的含义是遍历每个元素筛选出 score 大于 0.9 的然后只输出 id 和 name 字段。写起来一行表达能力相当于 Python 里三四行循环加条件判断。我实际调试 AI 接口时最常用的场景是看 token 消耗和报错信息。比如curl ... | jq {error, usage}一眼就能看到有没有报错、这次调用费了多少 token。没有 jq 的情况下你可能要复制一坨 JSON 到网页工具里格式化效率完全不是一个量级。新手最常犯的错误是忘了 jq 表达式里字段名的大小写和空格。JSON 是严格区分大小写的字段名匹配不上时 jq 会返回 null但不会报错。这种情况最容易让人困惑排查思路是先cat 文件 | jq keys看看顶层有哪些字段再逐层深入。我经常用jq .[0]把一个大数组的第一条记录打出来看看结构长什么样。3.4 fzf把模糊搜索嵌入终端的每个角落fzf 是一个模糊查找器但它带来的效率提升远超“查找”两个字。你要理解它的核心价值只需要记住一个场景你在终端里按一下 CtrlR想要调出之前输入过的某条命令fzf 会给你一个交互式的搜索结果列表你随便打几个字母它就在上千条历史命令里实时模糊匹配回车即执行。安装之后默认不自动启用历史命令搜索需要加一行配置。装好 fzf 后运行它的安装脚本git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install这个脚本会帮你配置 shell 的 CtrlR历史命令搜索、CtrlT文件搜索和 AltC目录跳转快捷键。安装完重开终端就能用了。fzf 最有价值的一点是可以跟任意命令组合。它的工作模式是接收输入流、让你交互式选择、把选中的结果输出。这句话听着抽象举个例子就明白了。假设你想删除当前目录下的一批日志文件但不是全部删find . -name *.log | fzf --multi | xargs rm这条命令会先列出所有 log 文件你可以在 fzf 的界面里用 Tab 键多选选完后自动执行删除。整个过程有点像文件管理器里的勾选但完全在终端里完成还带模糊搜索。对我来说fzf 还有一个绕不开的使用场景在大量模型配置中快速找到要编辑的那一个。我会把模型的名称、大小、备注写进一个文本文件然后cat models.txt | fzf找到目标之后它会打印出那一行我再把这个文本复制出来做后续操作。跟拿眼睛在一长串文本里扫相比快太多了。fzf 进阶用法非常丰富比如可以自定义预览窗口。预览功能特别适合代码文件查找你输入vim $(fzf --preview bat --coloralways {})在搜索文件的同时右侧会实时显示文件内容预览选到哪个文件就看哪个。这种体验已经接近 IDE 的文件搜索了但跑在终端里资源占用极低。踩坑提醒fzf 在 macOS 上如果是从源码编译的可能需要依赖 homebrew 安装的 vim 之类的东西。建议直接用包管理器安装别自己从源码折腾。而且默认情况下 fzf 的 CtrlT 文件搜索不会搜索隐藏文件如果你想看到.env这类文件需要设置环境变量FZF_DEFAULT_COMMAND为find . -type f之外还要加上-name .*之类的隐藏文件匹配参数或者直接用fd这类的现代查找工具配合。3.5 yt-dlpAI 素材管线的第一道闸门yt-dlp 是知名的 youtube-dl 的活跃分支一个命令行音视频下载工具。支持上千个网站。它在大模型时代特别有存在感的原因是AI 的视频理解、音频转写、字幕生成需求越来越旺盛而 yt-dlp 是获取原始素材最趁手的工具。安装方式# macOS brew install yt-dlp # Python 方式 python -m pip install yt-dlp最基础的用法是下载一个视频yt-dlp https://example.com/watch?vxxxx默认情况下它会下载最高画质的视频和音频。但很多时候我们不需要那么大的文件比如你只是想让 AI 转写视频里的语音那只需要音频就够了yt-dlp -f ba https://example.com/watch?vxxxx其中-f ba的意思是 best audio只下音频不搞视频。建议下完直接用 ffmpeg 转成 wav 格式因为 whisper 类的语音识别模型对 wav 的兼容性最好yt-dlp -f ba -x --audio-format wav https://example.com/watch?vxxxx-x是提取音频--audio-format wav是转格式。如果你要做视频内容分析通常需要同时拿到画面文本和语音文本。一个实用组合是下载视频的同时把字幕也抓下来yt-dlp --write-subs --sub-langs zh-Hans,en --skip-download https://example.com/watch?vxxxx--write-subs下载字幕--sub-langs指定语言--skip-download表示不下视频本体速度快省流量只拿字幕文件。这里有个重要提示yt-dlp 每次工作前会更新自家的扩展名单有些站点改版之后旧版本会失效。所以遇到“该网站不支持”这类报错第一件事是升级 yt-dlpyt-dlp -U我踩过最大的坑是格式选择。有些网站的-f参数会导致下载失败因为视频流和音频流是分离存放的需要指定合并。这时候最简单的方法是不指定格式直接让 yt-dlp 自己选yt-dlp -f bv*[height1080]ba/b https://example.com/watch?vxxxx这个表达式意思是优先选择 1080p 及以下的视频流加上最佳音频流如果找不到就退而求其次用默认的最高质量。表示视频和音频分离时要合并/表示如果前半段匹配不到就用后半段兜底。4. 实战组合拳一条完整的 AI 素材处理流水线讲完 5 个工具要真正体会它们的价值最好看一次组合起来的完整工作流。我拿一个实际项目来演示把一段教学视频自动变成一份带要点的文章。如果我把这个需求拆解成脚本大概的思路是这样的第一步用 yt-dlp 把视频音频和字幕拉下来。第二步用 whisper 之类的语音识别模型把音频转成文字或者直接使用抓取到的字幕。第三步把文本按段落拆分成 JSON 结构。第四步用 ollama 本地模型对文本做总结。第五步把总结结果写进 Markdown 文件。全程我只需要在终端里执行几条命令中间偶发的文件选择用 fzf 解决。第一步下载视频素材。这一步同时拿音频和字幕yt-dlp -f ba -x --audio-format wav -o lecture.%(ext)s https://example.com/lecture yt-dlp --write-subs --sub-langs zh-Hans --skip-download -o lecture.%(ext)s https://example.com/lecture这里你需要注意-o参数指定输出文件名模板。.%(ext)s的意思是保留原来的扩展名。不指定的话 yt-dlp 会用视频标题做文件名里面可能带空格和特殊字符后面处理起来很麻烦。第二步转写文本。如果没有字幕用 whisper 之类的工具转音频。我自己用的是 whisper.cpp 的编译版本速度快内存小。转写完之后输出一个带时间戳的文本或者 SRT 字幕。第三步广播分割文本。把 SRT 字幕解析成结构化 JSON每条记录包含start、end、text三个字段。这种数据结构就是为 jq 量身定做的。如果你想统计整个视频的说话总时长或者按时间区间提取内容jq 一条命令就搞定了cat transcript.json | jq .[] | {start, end} | .end - .start | awk {sum $1} END {print 总时长: sum 秒}这只是个例子。在实际场景里我会用 jq 配合时间筛选把前 10 分钟的内容单独抽出来cat transcript.json | jq .[] | select(.start 600) | .text第四步汇总文本并喂给 ollama。我通常会把文本内容保存成临时文件然后写一个小的脚本调用 ollama 的 API 做总结总结的 prompt 会有意识地要求模型保留重点、结构化输出。这一步因为调用的是本地模型不涉及数据外传处理几十上百页的内容也没有隐私负担。最后一步把总结输出到 Markdown 文件或者直接通过管道扔给 aider让它根据大纲生成一篇完整文章。整条流水线跑下来你会发现 5 个工具各司其职中间没有一步需要打开浏览器图形界面。yt-dlp 负责素材采集、jq 负责数据清洗、ollama 负责内容生成、aider 负责代码层面的调整和文件操作、fzf 负责在操作过程中快速定位或选择目标。效率提升不是一倍两倍的事而是“原来需要花半天手工做的事情现在一条命令加几分钟等模型算完就完事”的质变。这也可以回答一个许多人问过我的问题我不会编程学命令行工具意义大吗我的答案是这套流水线里 jq 和 yt-dlp 的使用门槛并不高真正需要编程思维的部分反而是如何把命令串起来跑通。而用管道把命令串起来这件事正是命令行最迷人的地方——它不需要你写完整的程序只需要你有一颗拆解流程的心。命令行的学习曲线虽然有点陡但爬上去之后你获得的是一条永不过时的效率公理。5. 常见问题与排错实录任何工具用久了都会遇到问题我把自己和身边朋友踩过的典型坑整理成一份速查表按工具分类方便你将来遇到事儿的时候直接翻。5.1 工具安装与环境配置类问题问题一安装 aider 时提示command not found: aider。多半是 pip 的 bin 目录没进 PATH。Linux 和 macOS 的解决方法是在 shell 配置文件里加一行把用户级 bin 目录加进去。Windows 上如果出现这个问题大概率是 Python 环境变量没配好。建议 Windows 用户优先走 pipx 安装pipx install aider-chat问题二ollama 启动后占内存太高机器明显卡顿。这是很常见的现象大模型默认会尽量利用资源。我实测下来在 16GB 内存的 Mac 上跑 7B 模型ollama 会占掉大概 8GB 内存。如果同时开着浏览器和编辑器会比较紧张。解决办法是控制并发加载模型数使用环境变量OLLAMA_MAX_LOADED_MODELS1重启服务。另外如果只是单次任务不想常驻服务用完直接ollama stop也可以释放资源。注意一点如果你用ollama run进入对话界面后再按 CtrlD 退出模型并不会自动卸载建议用ollama stop 模型名主动清理。问题三yt-dlp 下载时提示“不支持该站点”或直接报错。绝大多数情况是版本太旧。这个工具更新频率很高很多网站改了前端结构之后老版本的解析器就失效了。先用yt-dlp -U升级到最新版再重试。另外某些站点对频次和并发有限制一次下载太多分段文件时容易触发反爬建议单任务并发数降低用-N 2之类的参数控制并发下载数。5.2 命令使用与数据解析类问题问题四jq 解析 JSON 时返回 null但不报错。这种情况让我栽过几次跟头。jq 的过滤器语法非常严格字段名错了它不会崩溃只返回 null。我现在的排查习惯是先用jq keys看顶层结构再逐层展开如果是数组结构先jq .[0]看第一个元素的字段名。还有一个容易忽略的是 JSON 里的数字赋值如果接口返回的是字符串0.8而不是数字0.8你拿它跟0.8做数值比较会不成立。这时候需要先用tonumber做类型转换。问题五fzf 不显示隐藏文件。默认情况下 fzf 的文件搜索命令不会包含隐藏文件。如果你要操作.env或.gitignore这类文件得改配置。最省事的办法是给终端设置里加一个默认命令让所有文件名都以非隐藏方式被查找同时也可以考虑装fd它在性能和隐藏文件处理上的体验好很多fzf 也原生支持跟 fd 配合使用。问题六aider 改代码时“答非所问”提出的需求它完全理解偏了。这往往不是模型笨而是你没有给它足够的上下文。aider 不会自动读取整个仓库它只看你/add进去的文件。如果你说的改动逻辑涉及另外某个文件但它没有被加入那模型就只能猜。我的经验是描述需求前先想清楚会涉及哪些文件宁可多添加一两个也不要漏。添加完之后可以用一句明确的话开头比如“我需要修改以下文件中的函数...”这样它分析时的注意力会更聚焦。问题七yt-dlp 下载的视频和音频不同步。这是做本地素材处理时的常见痛点。因为某些流媒体源把视频和音频分开存放下载完是两个不同文件如果播放器不会自动合并就会出现有声没画或者有画没声的情况。解决办法是在下载命令里明确指定合并格式比如 mp4yt-dlp -f bv*ba --merge-output-format mp4 url如果机器上已经装了 ffmpegyt-dlp 会默认调用它完成合并。装 ffmpeg 其实也是这些工具里最值得做的一件事它是视频音频处理绕不开的底座。5.3 我踩过最深的三个坑最后分享三个让我记忆犹新的实际问题它们都不是什么高深的技术难题但解决过程非常典型。第一个坑是 ollama 和 Docker 抢端口。我本机同时跑着一些容器化服务安装了 ollama 之后启动ollama serve发现 11434 端口被占用。排查半天才发现是之前某个容器把内部端口映射到了 11434。解决方法是改 ollama 的端口监听配置在启动时代入环境变量OLLAMA_HOST127.0.0.1:11435 ollama serve或者直接把占用端口的容器停掉。第二个坑是 aider 在大仓库里反应特别慢。我在一个几十 GB 的 monorepo 里使用 aider启动时要扫描大量文件操作变得卡顿。后来在根目录写了.aiderignore把node_modules/、dist/、.git/、assets/这些大目录全部排除重启后流畅了很多。这个配置文件非常值得重视仓库越大越需要精心的忽略规则。第三个坑是 fzf 和 shell 的别名冲突。我用 zsh之前配了 CtrlR 做反向搜索历史命令安装 fzf 之后 CtrlR 被接管但我没有重新登录 shell导致快捷键不生效。折腾半天才发现是 shell 配置没有 source。遇到 fzf 快捷键没反应第一步检查~/.fzf/shell/completion.zsh是否被加载第二步确认 shell 配置文件的加载顺序。这些问题看着小但足够消耗你半小时的耐心。工具这东西最难的不是“学会用”而是学会在正确的场景里想起它。我之所以把这 5 个工具放在一起就是因为它们在我日常的工作流里不断互相触发。每一次在终端里顺利跑完一条自动化流水线我都会觉得当初花时间学命令行真是最值的一笔投资。