Skip to content

Windows 上 Bash 工具用 cmd /C 执行命令导致带空格的参数错误 #171

Description

@Leexunhuan743

Bug

Windows 上 Bash 工具通过 cmd /C 执行命令。cmd.exe 对双引号的解析规则和 POSIX shell 不同,导致命令参数中的双引号被当作字面字符。

Go 的 exec.Command 对含空格的参数会自动加双引号并转义内部双引号(加反斜杠)。cmd /C 不识别反斜杠转义,最终导致带空格的引号参数被错误拆分。

根因

tools/sandbox.go:106-116:

func plainShellCmd(command, cwd string) *exec.Cmd {
    var cmd *exec.Cmd
    if runtime.GOOS == "windows" {
        cmd = exec.Command("cmd", "/C", command)   // ← 问题
    } else {
        cmd = exec.Command("sh", "-c", command)
    }
}

复现

用 Go 程序验证:

exec.Command("cmd", "/C", `go run printargs.go --title "Hello World"`)

cmd /C 结果:

argv[0]: --title
argv[1]: "Hello
argv[2]: World"

双引号变成参数的一部分,Hello 和 World 被拆成两个参数。

建议修复

将 Windows shell 从 cmd /C 改为 powershell -Command

if runtime.GOOS == "windows" {
    cmd = exec.Command("powershell", "-Command", command)
}

powershell.exe 是 Windows 10/11 自带组件,不需要额外安装。它正确解析单引号字符串,参数中的空格不会提前拆分。

powershell -Command 测试结果:

argv[0]: --title
argv[1]: Hello World

✅ 正确,一个完整参数。

绕过方法

set TITLE=带空格的标题
your-command --title %TITLE%

环境

  • OS: Windows 11
  • deepx 模式: native

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions