Подтвердить что ты не робот

Как отладить ошибку "exit status 1" при запуске exec.Command в Golang

Когда я запустил код ниже:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println("Result: " + out.String())

Я получаю эту ошибку:

статус выхода 1

Однако это не помогает отлаживать точную причину ошибки.

Как получить более подробную информацию?

4b9b3361

Ответ 1

Решение состоит в использовании свойства 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: найти: -exec: no terminating ";" или "+"

Ответ 2

Как отметил Лоран, вы можете переопределить дескриптор файла Stderr, чтобы захватить вывод stderr для лучшего сообщения об ошибке. Я лично предпочитаю использовать метод CombinedOutput для команды, если делать что-то относительно простое:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
output, err := cmd.CombinedOutput()
if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + string(output))
    return
} else {
    fmt.Println(string(output))
}

Здесь ссылка play.golang.org для приведенного выше примера: http://play.golang.org/p/z8k9zO755P