Skip to content
FunCoding

Search

Search docs, Skills and MCP

在自定义命令中执行 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 输入。