at backyard

Color my life with the chaos of trouble.

goでexec.Command実行時に出力結果やエラーログをコンソールに表示させたい

Go初心者による備忘録のため、Go経験者にとっては当たり前の内容を書いていると思うことを先に書いておく

exec.Commandの出力をCLI上に表示させる方法

Goでは exec.Command を利用することでシェル上でコマンドで実行するような形で、Goプログラムを通じてコマンドを実行できる。
例えば下記のような形で実行できる。

cmd := exec.Command("ls")
err = cmd.Run()
if err != nil {
    fmt.Printf("Command failed: %v\n", err)
    os.Exit(1)
}

ただ、このような書き方の場合、lsコマンドの実行出力結果はプログラム実行時に表示されないし、仮にエラーになったとしても exit status 1 が出るのみとなる。

成功した場合でもエラーの場合でも、シェル上で出力される内容を同じようにコンソール上に表示させるためには下記のようにする必要がある。

var out bytes.Buffer
var stderr bytes.Buffer

cmd := exec.Command("ls")
cmd.Stdout = &out
cmd.Stderr = &stderr

err = cmd.Run()
if err != nil {
    fmt.Printf("Command failed: %v\n%v\n", err, stderr.String())
    os.Exit(1)
}

fmt.Printf("Result:\n%v\n", out.String())

これで成功した場合でもエラーとなった場合でも、それぞれの出力結果が実行時のコンソール上に表示される。