Golang os/exec 使用
Cmd结构
type Cmd struct {
// Path 是要运行的命令的路径
// 该字段不能为空,如为相对路径会相对于Dir字段。
Path string
// Args保管命令的参数,包括命令名作为第一个参数。
// 如果为空切片或者nil,相当于无参数命令。
// 典型用法下,Path和Args都应被Command方法设定。
Args []string
// Env指定进程的环境,如为nil,则是在当前进程的环境下执行。
Env []string
// Dir指定命令的工作目录。
// 如为空字符串,会在调用者的进程当前目录下执行。
Dir string
// Stdin指定进程的标准输入,如为nil,进程会从空设备读取(os.DevNull)
Stdin io.Reader
// Stdout和Stderr指定进程的标准输出和标准错误输出。
// 如果任一个为nil,Run方法会将对应的文件描述符关联到空设备(os.DevNull)
Stdout io.Writer
Stderr io.Writer
ExtraFiles []*os.File
SysProcAttr *syscall.SysProcAttr
// Process是底层的,只执行一次的进程。
Process *os.Process
// ProcessState包含一个已经存在的进程的信息,只有在调用Wait或Run后才可用
ProcessState *os.ProcessState
// 内含隐藏或非导出字段
}
1、简单执行shell命令
cmd.Run()方法,会阻塞执行命令,如果出错,看不到错误具体的命令错误信息,返回的err类似exit status 11
。
package main
import (
"fmt"
"time"
"os/exec"
"path/filepath"
)
var TmpFileDir = "/Users/zuiyou/Desktop"
func main() {
imgUrl := "https://pic.qqtn.com/up/2019-9/15690311636958128.jpg"
fid := fmt.Sprintf("%d-webp.jpg", time.Now().UnixNano())
webpPath := filepath.Join(TmpFileDir, fid)
args := []string{
imgUrl, "-quality", "70", webpPath}
cmd := exec.Command("magick", args...)
err := cmd.Run()
if err != nil {
fmt.Printf("failed to ImgWebpConvert, cmd: magick %s, err: %s\n", strings.Join(args, " "),
err.Error())
return
}
fmt.Printf("magick %s\n", strings.Join(args, " "))
return
}
2、命令行输出执行结果和错误信息
package main
import (
"os"
"fmt"
"time"