Skip to content
FunCoding

Search

Search docs, Skills and MCP

Shell 执行与后台进程

设置工作目录、PTY 和受管后台模式,正确判定退出状态。

This page has not been translated into English yet. The original Chinese version is shown below.

run_shell_command 运行系统命令。Windows 默认 cmd.exe /c,其他平台 bash -c;不要因为自己的登录 shell 是 zsh 就按 zsh 专有语法构造命令。

参数

command 必填;description 显示目的;directory 相对项目根目录,省略使用根目录。is_background 默认 false,适合构建、测试等会自行结束的任务。

run_shell_command(
  command="npm run build",
  description="Build the project",
  directory="packages/web",
  is_background=false
)

读文件与搜索优先用 read_file、grep_search、glob;shell 留给真正的系统命令。结果要结合 Stdout、Stderr、Error、Exit Code 与 Signal 判断,存在日志输出不代表命令成功。

受管后台

长期服务设 is_background:true。工具立即返回 shell ID/PID,进程进入后台任务管理;不要再加末尾 &。

is_background:true 加裸尾随 & 会拒绝;false 时 shell 层的 & 可能把进程自行分离,但没有受管任务条目,task_stop 无法按该机制停止。需要持续观察每条输出时改看Monitor。

PTY 默认取决于入口

未显式设置 tools.shell.enableInteractiveShell 时,一次性显式 prompt 使用 child_process;交互 TUI、ACP、stream-json 输入、仅 stdin 和文件输入会话使用 PTY。显式 true/false 可覆盖选择,但 node-pty 不可用时仍回退。

Windows build <=19041 会回退 child_process;这是官方列出的实现边界,不应仅根据系统显示名判断 PTY 可用。需要输入的 vim、交互 rebase 或 TUI 程序依赖可用 PTY,Ctrl+F 可聚焦运行中的交互 shell。

{
  "tools": {
    "shell": {
      "enableInteractiveShell": true,
      "showColor": true,
      "pager": "less"
    }
  }
}

showColor 和 pager 只对交互 shell 生效;非 Windows pager 默认 cat,Windows 没有默认值,空串关闭 pager 环境变量。子进程带 QWEN_CODE=1,脚本可据此识别来源。

命令限制不等于沙箱

旧式 tools.core 可列 run_shell_command(git) 等前缀;tools.exclude 优先排除,泛用 run_shell_command 相当于全部 shell 操作。&&、||、; 链拆分检查,任何部分不允许就拒绝整条,不能只检查首命令。

官方明确命令特定排除基于字符串匹配,不能依赖它安全执行不可信代码。通用 shell 注册、审批规则与系统隔离各有作用,见权限规则与沙箱。