这一节会展示向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!
上面的输出不会帮助你区分哪些数据是写到标准输出的,哪些数据写到标准错误的,而区分这些有时候是非常有用的。当然,如果你使用的是bash
shell,这里有一个技巧可以帮助你区分这些数据是写到哪里的。几乎所有的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