🐀

Go言語のprintln関数がシェルでファイルにリダイレクトしてくれなくてハマった

2022/05/15に公開
package main

func main() {
        println("Hello println")
}

これをファイルに書き出したいのでシェルでリダイレクトする

~/tmp:./hello0 > a.txt
Hello println   <ーシェルに出力される時点でなにかおかしい
~/tmp:cat a.txt
なにも出力されない
~/tmp:file a.txt
a.txt: empty

調べてみると println関数はビルトイン関数と言われているGo言語の組み込み関数で、普通の普通にprintで出力したい場合はfmt.Printlnの方を使わないといけないようだ。

The print built-in function formats its arguments in an implementation->specific way and writes the result to standard error. Print is useful for >bootstrapping and debugging; it is not guaranteed to stay in the language.
https://pkg.go.dev/builtin#print

printlnは標準出力でなくエラー出力に出るのでファイルへのリダイレクトがうまくいかなかった
あまり意識せずにprintlnとfmt.printlnを書いていたのでハマった。

package main

import (
	"fmt"
	"os"
)

func main() {
	println("Hello println")
	fmt.Println("Hello fmt.println")
	fmt.Fprintln(os.Stdout, "Hello fmt.Fprintln")
}

これを実行すると

~/tmp:./hello>b.txt
Hello println
~/tmp:cat b.txt
Hello fmt.println
Hello fmt.Fprintln

うまくいった。

Discussion