Stderr
解決策は、Command オブジェクトのプロパティを使用することです。これは次のように行うことができます。
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
fmt.Println("Result: " + out.String())
上記のコードを実行すると、問題が何であるかが明確になります。
終了ステータス 1: find: -exec: 終端なし ";" または「+」
編集:
上記のコードでは、エラーが発生した場合、メッセージが stderr に出力され、コマンドがゼロ以外のエラー コードを返すことが期待されます。これは多かれ少なかれ標準です。
ただし、@snorberhuis が後述するように、一部のコマンドはエラーを stdout に出力します。他のコマンドは stderr に出力される可能性がありますが、エラー コード 0 を返します (この場合err
は になりますnil
)。また、stderr にメッセージがあるからといって、必ずしもエラーがあるとは限りません (ffmpeg ツールはこれを頻繁に行います)。
したがって、基本的には、期待するコマンドに対応するために上記のコードを微調整する必要がある場合があります。