Skip to content

Latest commit

 

History

History
77 lines (57 loc) · 2.42 KB

File metadata and controls

77 lines (57 loc) · 2.42 KB

关于错误输出

这一节会展示向UNIX标准错误发送数据的技术,这是UNIX区分实际的数据和错误的方式。

程序stdERR.go 会向我们展示标准错误的使用,我们分两部分来看。由于向标准错误写数据会用到标准错误相关的文件描述符,所以stdERR.go 程序会基于stdOUT.go

第一部分是这样的:

package main
import (
	"io"
	"os"
)
func main() {
	myString := "" arguments := os.Args
	if len(arguments) == 1 {
		myString = "Please give me one argument!" 
	} else {
		myString = arguments[1] 
	}

到目前为止,程序stdERR.go几乎和stdOUT.go是一样的。

然后我们看stdERR.go的第二部分:

	io.WriteString(os.Stdout, "This is Standard output\n")
	io.WriteString(os.Stderr, myString) 
	io.WriteString(os.Stderr, "\n")
}

这里你调用io.WriteString()两次向os.Stderr写入,调用一次向os.Stdout写数据。

执行stdERR.go会得到以下输出:

$ go run stdERR.go
This is Standard output 
Please give me one argument!

上面的输出不会帮助你区分哪些数据是写到标准输出的,哪些数据写到标准错误的,而区分这些有时候是非常有用的。当然,如果你使用的是bashshell,这里有一个技巧可以帮助你区分这些数据是写到哪里的。几乎所有的shell用他们自己的方式都提供了这项功能。

当你使用bash的时候,你可以像下面这样把标准错误重定向到一个文件:

$ go run stdERR.go 2>/tmp/stdError 
This is Standard output
$ cat /tmp/stdError
Please give me one argument!

相似的,你也可以把错误输入重定向到/dev/null这个设备来忽略他们,这样就告诉系统完全无视这些错误:

$ go run stdERR.go 2>/dev/null 
This is Standard output

在前面的两个例子中,我们把标准错误的文件描述符分别重定向到一个文件和/dev/null。如果你希望同时保存标准错误和标准输出到同一个文件,你可以把标准错误的文件描述符(2)重定向到标准输出的文件描述符(1)。下面的命令展示了这项技术,这在unix系统中是非常常见的。

$ go run stdERR.go >/tmp/output 2>&1 
$ cat /tmp/output
This is Standard output
Please give me one argument!

最后,你也可以把标准错误和标准输出到发送到/dev/null

$ go run stdERR.go >/dev/null 2>&1