コマンドラインオプションをflagでパースしたとき-hを指定するとexit status2と出てしまう

どういうこと

golangではコマンドラインオプションをflagパッケージを使ってパースすることができる。 しかし、オプションに-h--helpを指定すると、以下のようにexit status2と出てしまう。 なぜこんな仕様なのか...

$ go run flagSample.go -h
Usage:
  -n int
        number to use (default 1234)
exit status 2

これを出ないようにしたい。

対応策

flag.Usage を使ってUsageを表示するときに動かす関数を指定してあげ、その関数内で os.exit(0) を呼ぶと-h--helpを指定したときの statusコードは0となり、exit status2は出なくなる。以下にコード例を示す。

コード

これは、-nで指定した数字を表示するだけのコマンドラインツールのコードである。flag.Usageで指定したUsage()内でos.exit(0)を呼んでいるので、exit status2 は出ない。

package main

import (
    "flag"
    "fmt"
    "os"
)

var number int

func usage() {
    fmt.Println("Usage:")
    flag.PrintDefaults()
    os.Exit(0)
}

func init() {
    const defaultNumber = 1234
    flag.IntVar(&number, "n", defaultNumber, "number to use")
    flag.Usage = func() { usage() }
}

func main() {
    flag.Usage = func() { usage() }
    flag.Parse()
    fmt.Println("flag test")
    fmt.Printf("Number: %d\n", number)
}

実行結果

$ go run flagSample.go -n 6666
flag test
Number: 6666
$ go run flagSample.go -h
Usage:
  -n int
        number to use (default 1234)