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
]