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