Help us understand the problem. What is going on with this article?

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

More than 5 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初投稿でした。
こんなんでいいでしょうか?

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした