在自定义命令中执行 Shell
用 !{...} 收集动态上下文,理解执行确认、括号解析和失败输出。
This page has not been translated into English yet. The original Chinese version is shown below.
!{...} 会在发送最终提示之前执行 Shell 命令,然后把输出嵌入提示。适合读取当前 Git 状态、差异或其他本地信息;它会实际启动命令,而不是仅把命令文字交给模型。
根据暂存差异生成提交说明
在 .gemini/commands/git/message.toml 写入:
description = "Draft a commit message from the staged diff."
prompt = """
Draft a Conventional Commit message for these staged changes:
!{git diff --staged}
"""运行 /commands reload 后调用 /git:message。CLI 检查并确认 git diff --staged,将输出填入提示,再请求模型生成说明。模板中的 Shell 只读取暂存差异,没有执行 git commit。
执行确认与参数
当模板包含 Shell 注入时,CLI 会对解析后的命令做检查并提示确认。确认内容已经包含 {{args}} 在 Shell 块内的转义替换;详情见参数处理。如果命令来自仓库或扩展,仍需看实际命令内容,而不只看 description。
花括号必须平衡
解析器支持嵌套花括号,例如包含 JSON 的命令,但 !{...} 内的花括号需要配对。若命令必须包含不平衡的花括号,将逻辑放进外部脚本,再在模板中调用脚本。不要通过反复补引号猜测模板解析与 Shell 解析的组合行为。
失败仍可能成为模型输入
命令失败时,注入内容会包含 stderr 和退出状态行,例如:
[Shell command exited with code 1]因此收到模型回答不代表前置命令成功。先核对错误与退出状态;必要时让模板明确要求“前置命令失败时报告原因,不据此推断没有差异或没有搜索结果”。
与交互输入的区别
模板中的 !{...} 用于准备模型输入;直接在输入框键入 !git status 是 Shell passthrough,单独的 ! 切换 Shell 模式。两者语法和使用位置不同,参见文件引用与 Shell 输入。