先通过系统库exec.LookPath
判断可执行程序是否存在
package main
import (
"fmt"
"os/exec"
)
func checkExeExists(exe string) {
path, err := exec.LookPath(exe)
if err != nil {
fmt.Printf("didn't find '%s' executable\n", exe)
return
}
fmt.Printf("'%s' executable is '%s'\n", exe, path)
}
func main() {
checkExeExists("ls")
checkExeExists("bee")
}
确认可以执行后,捕获执行结果并显示进度
package main
import (
"bytes"
"fmt"
"io"
"log"
"os"
"os/exec"
)
func main() {
var stdoutBuf, stderrBuf bytes.Buffer
cmd := exec.Command("bee", "version")
stdoutIn, _ := cmd.StdoutPipe()
stderrIn, _ := cmd.StderrPipe()
var errStdout, errStderr error
stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
stderr := io.MultiWriter(os.Stderr, &stderrBuf)
err := cmd.Start()
if err != nil {
log.Fatalf("cmd.Start() failed with '%s'\n", err)
}
go func() {
_, errStdout = io.Copy(stdout, stdoutIn)
}()
go func() {
_, errStderr = io.Copy(stderr, stderrIn)
}()
err = cmd.Wait()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
if errStdout != nil || errStderr != nil {
log.Fatal("failed to capture stdout or stderr\n")
}
outStr, errStr := string(stdoutBuf.Bytes()), string(stderrBuf.Bytes())
fmt.Printf("\nout:\n%s\nerr:\n%s\n", outStr, errStr)
}
![](https://img.haomeiwen.com/i258042/ed1e565599ac72e9.png)
网友评论