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

时间:2017-04-06 01:04:39

标签: go

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

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

cmd := exec.Command("tr", "a-z", "A-Z")

这很好用:

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

这失败了:

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

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

2 个答案:

答案 0 :(得分:6)

args := strings.Fields("ifconfig  -a ")
exec.Command(args[0], args[1:]...)

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

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

答案 1 :(得分: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

您尝试实现的目标:

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)