Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?