使用Go语言exec执行命令报"No such file or directory"错误求助
解决Go exec包执行带空格路径命令的"No such file or directory"错误
你的问题根源在于使用strings.Fields()拆分命令字符串,这个函数会将所有空格作为分隔符,把带空格的路径拆成了多个独立参数(比如/Users/ltuser/Library/Application和Support/Google/Chrome Beta/Default变成两个参数),导致find命令无法识别完整路径。
解决这个问题最直接的方式是直接构造参数切片,不通过字符串拼接再拆分,因为exec.Command()本身支持直接传递独立参数,不需要对空格做任何转义:
// 直接定义完整的参数切片,带空格的路径作为一个完整元素 args := []string{ "/Users/ltuser/Library/Application Support/Google/Chrome Beta/Default", "-mindepth", "1", "!", "-name", "Preferences", "-delete", } cmd := exec.Command("find", args...) op, err := cmd.CombinedOutput() if err != nil { fmt.Println("error", err.Error()) }
如果一定要基于字符串构造参数,不要用strings.Fields(),可以使用shellquote.Split()(需要导入github.com/kballard/go-shellquote包)来正确解析带空格的路径:
import "github.com/kballard/go-shellquote" cmdStr := "find /Users/ltuser/Library/Application Support/Google/Chrome Beta/Default -mindepth 1 ! -name Preferences -delete" args, err := shellquote.Split(cmdStr) if err != nil { // 处理解析错误 } cmd := exec.Command(args[0], args[1:]...) op, err := cmd.CombinedOutput() if err != nil { fmt.Println("error", err.Error()) }
不过更推荐第一种方法,不需要额外依赖,且更符合exec包的设计逻辑——直接传递参数可以避免shell解析带来的潜在问题,也不需要处理转义。
内容的提问来源于stack exchange,提问作者Ritesh kumar
相关产品推荐
相关产品推荐

