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

More than 3 years have 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初投稿でした。

こんなんでいいでしょうか?