Gemini CLI 的坑:Shell命令和交互式指令是两回事
前言
我第一次装 Gemini CLI 时,只会用 gemini "hello" 这种最基础的调用。直到某天翻文档看到 /chat save,才意识到这东西远不止一个命令行聊天工具那么简单。
它的命令系统其实分两层:一层是在系统 Shell 里启动任务的外层命令,另一层是进入交互式会话后才能用的内置指令。这个双层结构一开始让我挺困惑的,但搞明白之后发现确实比单层设计灵活很多。
Shell 命令层:脚本化调用的入口
这层命令在系统 Shell 里执行,主要用来启动任务或做一次性操作。
gemini [flags] [prompt] — 主命令
最常用的就是这个。它的价值不在于聊天,而在于可以通过 flags 实现脚本化调用:
-m: 指定本地文件(图片、视频)进行多模态输入-s: 流式输出,能即时看到响应而不是干等-o json: 输出 JSON 格式,方便和其他脚本集成- 管道支持:
cat error.log | gemini "分析这段报错"这种用法在调试时很顺手
我试过用管道传 10MB 日志文件,结果直接超 Token 限制被拒了。后来学会先用 head -n 100 截取再传,才解决问题。
gemini check — 诊断工具
初次配置时必跑的命令。它会检查 API 连接、认证和服务状态。我之前遇到过一次莫名其妙的 403 错误,跑了这个才发现是项目 ID 配错了。
gemini count-tokens — Token 计数器
大模型按 Token 计费,这命令用来估算成本。在提交长文本前先跑一下,避免被账单吓到。
说白了,这层命令就是负责启动、单次任务和环境诊断的。
交互式命令层:会话中的精细控制
直接运行 gemini 进入交互式会话后,这层指令才开始发挥作用。它们通过特殊前缀(/, @, !)调用,用来精细控制会话行为。
/ 斜杠命令:控制工具本身
这类命令不会发给 AI,而是控制 CLI 工具的状态。
会话管理
/chat save|resume|list: 保存和恢复对话。我常用这个切换不同探索分支,比如同时测试两种代码重构方案。/compress: 压缩上下文。我测过一次 150 轮对话的压缩,Token 从 9000 降到 1200,但发现中间有段调试信息丢了,所以压缩前最好先/chat save备份。/clear(或Ctrl+L): 清屏/quit//exit: 退出
上下文管理
/memory add|show|refresh: 管理从GEMINI.md加载的”分层指令内存”。这是给 AI 提供持久化背景知识的机制,比每次重复输入提示高效。不过我花了两天才搞明白它和@的区别 —/memory是全局的,@是单次注入。/restore: 回滚操作。如果 AI 修改了本地文件,这命令能恢复到执行前的状态。重要的安全保障。
环境与查询
/stats: 显示 Token 使用量、缓存节省等数据/mcp: 列出已配置的 MCP (Model Context Protocol) 服务器。说明 CLI 可以通过协议连接外部服务。/tools: 列出当前可用的所有工具
@ 符号命令:文件注入
这是开发者最常用的功能 — 把本地文件或目录内容注入到提示中。
用法: @src/main.go "这段代码有什么问题?"
核心特性:
- Git 感知: 默认忽略
.gitignore里的东西,不会把node_modules传给 AI - 目录支持: 可以直接传目录,工具会自动读取里面的文本文件
我踩过一次坑:用 @. 注入整个项目根目录,结果因为包含了二进制文件导致解析失败。后来学会指定具体子目录才解决。
! 感叹号命令:Shell 直通
在 CLI 内部直接执行系统命令。
!<command>: 单次执行,如!git status!: 单独输入可在 Gemini 模式和纯 Shell 模式间切换,方便连续执行多条系统命令
写在最后
这个双层设计一开始让我很困惑,但用了一周后确实感受到比单层命令灵活。外层负责脚本化和自动化,内层负责深度交互和上下文管理。
不过说实话,现在用 Gemini CLI 的人越来越少了。我观察到周围不少开发者都迁到了 Antigravity 或其他 Claude/Codex 的 CLI 工具 — 主要原因是它们能反代多个模型,不用为每个 API 单独配置一套环境。Gemini CLI 的双层指令设计确实精巧,但生态和灵活性上还是输了一筹。
如果你只是想快速上手一个 AI CLI,可能直接用 Antigravity 更省事。但如果你想深入理解这类工具的设计思路,Gemini CLI 的双层架构还是值得研究的 — 至少它让我明白了”Shell 命令”和”交互式指令”应该如何分工。