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
Bug
Windows 上 Bash 工具通过
cmd /C执行命令。cmd.exe对双引号的解析规则和 POSIX shell 不同,导致命令参数中的双引号被当作字面字符。Go 的
exec.Command对含空格的参数会自动加双引号并转义内部双引号(加反斜杠)。cmd /C不识别反斜杠转义,最终导致带空格的引号参数被错误拆分。根因
tools/sandbox.go:106-116:复现
用 Go 程序验证:
cmd /C结果:双引号变成参数的一部分,Hello 和 World 被拆成两个参数。
建议修复
将 Windows shell 从
cmd /C改为powershell -Command:powershell.exe是 Windows 10/11 自带组件,不需要额外安装。它正确解析单引号字符串,参数中的空格不会提前拆分。powershell -Command测试结果:✅ 正确,一个完整参数。
绕过方法
set TITLE=带空格的标题 your-command --title %TITLE%环境