golang调用外部程序,如何读取外部程序的stdout/stderr输出:

例子1 读取标准输出
$ cat main.go
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("bash", "test.sh")
    out, err := cmd.Output()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("stdout=[%s]\n", string(out))
}

$ cat test.sh
#!/bin/bash

echo "OOOO-1"
1>&2 echo "EEEE-1"
echo "OOOO-2"
1>&2 echo "EEEE-2"

运行结果:

$ ./main
stdout=[OOOO-1
OOOO-2
]

cmd.Output()函数的功能是运行命令并返回其标准输出。

例子2 读取标准输出和标准错误
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("bash", "test.sh")
    out, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("stdout=[%s]\n", string(out))
}

运行结果

$ ./main
stdout=[OOOO-1
EEEE-1
OOOO-2
EEEE-2
]

cmd.ComninedOutput()函数的功能是运行命令,并返回标准输出和标准错误。

例子3 分开读取标准输出和标准错误
$ cat main.go
package main

import (
    "fmt"
    "log"
    "bytes"
    "os/exec"
)

func main() {
    var outbuf, errbuf bytes.Buffer

    cmd := exec.Command("bash", "test.sh")
    cmd.Stdout = &outbuf
    cmd.Stderr = &errbuf

    var err error = cmd.Run();
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Stdout: [%s]\n", string(outbuf.Bytes()))
    fmt.Printf("Stderr: [%s]\n", string(errbuf.Bytes()))
}

运行结果

$ ./main
Stdout: [OOOO-1
OOOO-2
]
Stderr: [EEEE-1
EEEE-2
]