Golang学习之os/exec
问题1:Command函数中arg的参数拼接问题
函数func Command(name string, arg ...string) *Cmd
代码示例
- 可执行程序 dump.go
package main
import (
"flag"
"fmt"
)
func main() {
var act string
flag.StringVar(&act, "act", "", "cab|ga|err")
flag.Parse()
switch act {
case "cab":
fmt.Println("dump cab info")
case "ga":
fmt.Println("dump ga info")
case "err":
fmt.Println("trigger error")
default:
fmt.Printf("usage: ./dump --help\n")
}
}
- 准备编译可执行文件
dump
go build dump.go
- 包含os/exec包的程序 exec.go
package main
import (
"os/exec"
"fmt"
)
var (
execDump = "./dump"
dumpArgs = "-act err"
)
func main() {
out, err := exec.Command(execDump, dumpArgs...).Output()
if err != nil {
fmt.Printf("dump info failed, err=%v\n", err)
return
}
fmt.Printf("%v\n", string(out))
}
- 运行代码 exec.go
go run exec.go
- 执行出错,结果
dump info failed, err=exit status 2
分析
函数func Command(name string, arg ...string) *Cmd
。其中name
为可执行文件的路径,如果name
中不包含路径分隔符,则通过func LookPath(file string) (string, error)
;否则,根据绝对路径或相对路径去查找可执行文件。arg
为待传入的参数。
传递参数arg
时需注意将每个参数分割,不能将所有参数拼接为一个长字符串传入。如果按关键字方式传入参数,那么key-value
需要拆分后传入,且每个参数前后不能加入空格符。
解决方法
- 调整后的程序 exec.go
package main
import (
"os/exec"
"fmt"
)
var (
execDump = "./dump"
dumpArgs = []string{"-act", "err"}
)
func main() {
out, err := exec.Command(execDump, dumpArgs...).Output()
if err != nil {
fmt.Printf("dump info failed, err=%v\n", err)
return
}
fmt.Printf("%v\n", string(out))
}
- 执行结果,成功打印输出
trigger error
未完待续。。。