一直以来,Gemini CLI 的 run_shell_command 工具只能处理简单的、非交互式的命令。执行 ls -l 或 echo 'hello' 没问题,但一旦涉及到需要用户实时输入或具有复杂终端界面的程序,比如 vim、ssh、git rebase -i 或 top,通常会失败或者卡住。
这个限制在实际工作中很不方便。想象一下,如果正在使用 Gemini CLI 进行辅助开发,需要编辑一个配置文件或者进行交互式的 git 操作,却发现必须切换到另一个终端窗口才能完成。这种割裂的体验让 AI 助手难以真正融入到日常的开发流程中。
伪终端的解决方案
Gemini CLI 通过集成伪终端 (pseudo-terminal, pty) 彻底解决了这个问题。简单来说,Gemini CLI 现在可以在内部启动一个功能完整的虚拟终端。
技术实现上,这个方案使用了 xterm.js 和 node-pty 来提供完整的终端模拟:
- 双向通信:不仅能正确渲染程序的输出界面(包括光标移动、颜色、全屏刷新),还能将键盘输入实时传递给正在运行的程序
- ANSI 转义码支持:像
htop的彩色输出或vim的文本编辑器界面都能被正确显示 - 真实的 TTY 环境:为运行的程序提供一个真实的终端环境,而不是简单的 stdin/stdout 重定向
最好的一点是,这个功能的使用完全是透明的。不需要学习新的命令或添加特殊参数。
基本流程
- 正常发起请求:像以往一样用自然语言提出要求
- 自动识别:Gemini 的
run_shell_command工具能够识别交互式程序,自动启动虚拟终端 - 直接交互:终端界面立即切换为被调用程序的界面,可以像在普通 shell 中一样操作
- 焦点切换:按
Ctrl+T可以在交互式会话和 Gemini 主界面之间切换焦点 - 正常退出:使用程序自身的退出命令(如 vim 中的
:q,ssh 中的exit)
实际场景
现在这些操作都可以在 Gemini CLI 中无缝完成:
文件编辑:
> "用 vim 打开 config.json,把端口从 3000 改成 8080"Git 操作:
> "对最近 3 个 commit 进行交互式变基(interactive rebase)"远程连接:
> "通过 ssh 连接服务器检查日志文件"系统监控:
> "运行 htop 看看哪个进程占用 CPU 最高"配置选项
这个功能通过 tools.shell.enableInteractiveShell 配置项控制,默认值为 false。如果想使用这个功能,需要在配置中启用它:
{
"tools": {
"shell": {
"enableInteractiveShell": true
}
}
}值得注意的是,如果 node-pty 不可用,系统会自动回退到传统的 child_process 方式。
总结
这个改进不仅仅是技术上的升级,更重要的是它改变了 Gemini CLI 的定位。 AI 助手真正具备了处理复杂交互任务的能力。
对于开发者来说,这意味着可以更自然地将 AI 助手融入到现有的工作流中,而不需要在多个工具之间频繁切换。
从技术层面看,伪终端的引入为后续更多的终端功能扩展奠定了基础。可以预见,未来可能会有更多基于 TUI 的工具得到支持。