-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Description
Version
go 1.7 darwin/amd64
OS + Architecture
GOARCH="amd64"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.7/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.7/libexec/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
What did I do?
go --help
and go [subcommand] --help
What did you expect to see?
I expected these commands to write to stdout. I was trying to see what the -i
flag in go build -i
does, so I ran the command go build --help | grep -- -i
.
What did you see instead?
My buffer was flooded with the entire go build --help
message because it writes to stderr
instead of stdout
. This means I have to run go {subcommand} --help 2>&1 | grep -- -{flag}
when figuring out what a flag does.
However, when running commands like go env
and go version
, output is written to stdout
. This leads to confusion: when should I have to combine stderr
and stdout
? What if there was a genuine error in the go {subcommand}
that I run? I don't want to pipe that through grep and miss it, it may be important.
I think go
should pick a file descriptor---either stdout
or stderr
---to write all go
output to. In my opinion, go
should only ever write to stderr
if the binary itself fails in some respect. That way I don't miss any errors because I'm piping all of stderr
through grep
, head
, and the like.