我希望我的方法接收一个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参数中的类型字符串
答案 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)