写 Go 代码的时候,我期望将 cmd 的错误信息打印出来,代码如下
var cmdOut, cmdErr bytes.Buffer
cmd.Stdout = &cmdOut
cmd.Stderr = &cmdErr
err := cmd.Run()
if err != nil {
log.Fatal(err)
// log.Println(err)
}
cmdStdout := ConvertByte2String([]byte(cmdOut.String()), "GB18030")
cmdStderr := ConvertByte2String([]byte(cmdErr.String()), "GB18030")
fmt.Println("cmdStdout:", cmdStdout)
fmt.Println("cmdStderr:", cmdStderr)
ping 一个不通的域名产生了报错,什么都没有打印出来,而是给了个返回码 2。
当时我没有意识到这个问题,把代码发到群里,一个大佬 Cavan.xu 跑了一下代码,指出了问题出现在 log.Fatal
上。
改了一下,程序如期运行。
// log.Fatal(err)
log.Println(err)
看一下这个 log.Fatal
源码。Fatal 等价于 Print() 然后调用 os.Exit(1)。
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
std.Output(2, fmt.Sprint(v...))
os.Exit(1)
}