代码之家  ›  专栏  ›  技术社区  ›  marketer

如何在Go中获得系统命令的输出?

go
  •  38
  • marketer  · 技术社区  · 15 年前

    6 回复  |  直到 14 年前
        1
  •  2
  •   David Moles paddy-p    6 年前

    编辑: 这个答案已经过时了。请看 Fatih Arslan's answer


    使用 exec.Run Pipe 作为标准输出(如果需要,还可以作为标准输出)。它将返回cmd,其中包含 os.File ioutil.ReadAll .

    例子:

    package main
    
    import (
        "exec";
        "io/ioutil";
    )
    
    func main() {
        if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil {
            b, _ := ioutil.ReadAll(cmd.Stdout)
            println("output: " + string(b))
        }
    }
    
        2
  •  293
  •   rfay    4 年前

    package main
    
    import (
        "fmt"
        "log"
        "os/exec"
    )
    
    func main() {
        out, err := exec.Command("date").Output()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("The date is %s\n", out)
    }
    

    哪里 out 是标准输出。它的格式是 []byte

    string(out)
    

    你也可以使用 CombinedOutput() 而不是 Output() 返回标准输出和标准错误。

    exec.Command

        3
  •  33
  •   Travis Reeder    8 年前

    要将stdout和stderr都放入单独的字符串中,可以使用如下字节缓冲区:

    cmd := exec.Command("date")
    var outb, errb bytes.Buffer
    cmd.Stdout = &outb
    cmd.Stderr = &errb
    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("out:", outb.String(), "err:", errb.String())
    
        4
  •  6
  •   lcapra    6 年前

    // CmdExec Execute a command
    func CmdExec(args ...string) (string, error) {
    
        baseCmd := args[0]
        cmdArgs := args[1:]
    
        log.Debugf("Exec: %v", args)
    
        cmd := exec.Command(baseCmd, cmdArgs...)
        out, err := cmd.Output()
        if err != nil {
            return "", err
        }
    
        return string(out), nil
    }
    
    // Usage:
    // out, err := CmdExec("ls", "/home")
    
        5
  •  6
  •   Inasa Xia    4 年前
    cmd := exec.Command("ls", "-al")
    output, _ := cmd.CombinedOutput()
    fmt.Println(string(output))
    

    cmd := exec.Command(name, arg...)
    stdout, err := cmd.StdoutPipe()
    cmd.Stderr = cmd.Stdout
    if err != nil {
        return err
    }
    if err = cmd.Start(); err != nil {
        return err
    }
    for {
        tmp := make([]byte, 1024)
        _, err := stdout.Read(tmp)
        fmt.Print(string(tmp))
        if err != nil {
            break
        }
    }
    
        6
  •  4
  •   esm    15 年前

    两个选项,取决于您喜欢的范例:

    1. os.ForkExec()
    2. exec.Run()
        7
  •  2
  •   Andru Luvisi    15 年前

    使用 exec.Run ,用于标准装置的管道。从它返回的管道中读取。

        8
  •  0
  •   Zombo tliff    3 年前

    string 产出, strings.Builder 比[1]更有效 bytes.Buffer

    package main
    
    import (
       "os/exec"
       "strings"
    )
    
    func main() {
       c, b := exec.Command("go", "version"), new(strings.Builder)
       c.Stdout = b
       c.Run()
       print(b.String())
    }
    
    1. https://golang.org/pkg/bytes#Buffer.String