diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 2b35136081..9b90728a72 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -1237,7 +1237,7 @@ func (b *builder) processOutput(out []byte) string { func (b *builder) runOut(dir string, desc string, env []string, cmdargs ...interface{}) ([]byte, error) { cmdline := stringList(cmdargs...) if buildN || buildX { - b.showcmd(dir, "%s", strings.Join(cmdline, " ")) + b.showcmd(dir, "%s", joinUnambiguously(cmdline)) if buildN { return nil, nil } @@ -1304,6 +1304,24 @@ func (b *builder) runOut(dir string, desc string, env []string, cmdargs ...inter } } +// joinUnambiguously prints the slice, quoting where necessary to make the +// output unambiguous. +func joinUnambiguously(a []string) string { + var buf bytes.Buffer + for i, s := range a { + if i > 0 { + buf.WriteByte(' ') + } + q := strconv.Quote(s) + if s == "" || strings.Contains(s, " ") || len(q) > len(s)+2 { + buf.WriteString(q) + } else { + buf.WriteString(s) + } + } + return buf.String() +} + // mkdir makes the named directory. func (b *builder) mkdir(dir string) error { b.exec.Lock()