美文网首页
通过os/exec执行高级命令

通过os/exec执行高级命令

作者: 平凡啊菜 | 来源:发表于2017-06-19 20:03 被阅读20次

先通过系统库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)
}
赞赏是最真诚的认可

相关文章

网友评论

      本文标题:通过os/exec执行高级命令

      本文链接:https://www.haomeiwen.com/subject/mndnqxtx.html