Cmd.CombinedOutput()のerrorには何が返ってくるか

More than 1 year has passed since last update.

カブローン!
Qiita初投稿です。

Cmd.CombinedOutput()のerrorにはnilが返ってこないという話を耳にしたので、
何が返ってくるか検証してみました。

cmd.go
package main

import (
        "fmt"
        "os/exec"
)

func main() {
    out, err := exec.Command("aaa", "-b").CombinedOutput()
    fmt.Println("----- non-existent command -----")
    fmt.Println(string(out))
    fmt.Println("----- error -----")
    fmt.Println(err)
    fmt.Println("----- end -----\n")

    out, err = exec.Command("cat", "not_found_text").CombinedOutput()
    fmt.Println("----- error command -----")
    fmt.Println(string(out))
    fmt.Println("----- error -----")
    fmt.Println(err)
    fmt.Println("----- end -----\n")

    out, err = exec.Command("cat", "text").CombinedOutput()
    fmt.Println("----- correct command -----")
    fmt.Println(string(out))
    fmt.Println("----- error -----")
    fmt.Println(err)
    fmt.Println("----- end -----")
}

catを使ったのでcatで読むファイルも作りました。

text
text file!!!
text file!!!!
text file!!!!!

結果発表〜!

$ go run cmd.go 
----- non-existent command -----

----- error -----
exec: "aaa": executable file not found in $PATH
----- end -----

----- error command -----
cat: not_found_text: No such file or directory

----- error -----
exit status 1
----- end -----

----- correct command -----
text file!!!
text file!!!!
text file!!!!!
----- error -----
<nil>
----- end -----

まとめ
・存在しないコマンド
  標準出力&標準エラー出力無し
  errorにコマンドが存在しないと返ってくる
・存在するコマンドのエラー
  標準エラー出力にコマンドが投げたエラーが返ってくる
  errorに終了ステータスが1だったことが返ってくる
・存在するコマンドの正常系
  標準出力にコマンド結果が返ってくる
  errorはnil

結果的に正常なコマンドを投げればerrorはnilが返って来ることがわかりました。
errorがnilかどうかで標準出力か標準エラー出力かを判断すればいい感じですかね。
(またはCmd.StdinPipe()、Cmd.StdoutPipe()、Cmd.StderrPipe()あたりを駆使すればもっといいかも。時間あったら検証したい。)

Qiita初投稿でした。
こんなんでいいでしょうか?