LoginSignup
7
4

More than 5 years have passed since last update.

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

Posted at

カブローン!
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初投稿でした。
こんなんでいいでしょうか?

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4