如何从包含空格的字符串创建os.exec Command结构

cla*_*ter 5 go

我希望我的方法接收一个exec作为字符串的命令.如果输入字符串有空格,我如何将其拆分为cmd,args为os.exec?

文档说创建我的Exec.Cmd结构

cmd := exec.Command("tr", "a-z", "A-Z")
Run Code Online (Sandbox Code Playgroud)

这很好用:

a := string("ifconfig")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // prints ifconfig output
Run Code Online (Sandbox Code Playgroud)

这失败了:

a := string("ifconfig -a")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // 'ifconfig -a' not found
Run Code Online (Sandbox Code Playgroud)

我尝试过strings.Split(a),但是收到一条错误信息:不能使用(type [] string)作为exec.Command参数中的类型字符串

Mar*_*ark 7

args := strings.Fields("ifconfig  -a ")
exec.Command(args[0], args[1:]...)
Run Code Online (Sandbox Code Playgroud)

strings.Fields()在空格上分割,并返回一个切片

... 将切片扩展为单个字符串参数

  • 这不是一个通用的解决方案,如果参数本身包含空格,则会失败。 (3认同)

mwa*_*ski 5

请查看:https: //golang.org/pkg/os/exec/#example_Cmd_CombinedOutput

您的代码失败,因为exec.Command要求将命令参数与实际命令名分开.

strings.Split签名(https://golang.org/pkg/strings/#Split):

func Split(s, sep string) []string
Run Code Online (Sandbox Code Playgroud)

你想要实现的目标:

command := strings.Split("ifconfig -a", " ")
if len(command) < 2 {
    // TODO: handle error
}
cmd := exec.Command(command[0], command[1:]...)
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
    // TODO: handle error more gracefully
    log.Fatal(err)
}
// do something with output
fmt.Printf("%s\n", stdoutStderr)
Run Code Online (Sandbox Code Playgroud)

  • @kostix不,它不会起作用.文档说:`func命令(name string,arg ... string)*Cmd` - 因此你必须分别传递第一个参数(命令名).否则,你会产生错误:`没有足够的参数调用exec.Command`.我在@Mark的回答中指出了它,因为他犯了同样的错误. (2认同)