Как отладить ошибку "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
Однако это не помогает отлаживать точную причину ошибки.
Как получить более подробную информацию?
Ответы
Ответ 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