Ваш образец уже печатает ошибку как stdout
и stderr
.
По умолчанию пакет cobra
печатает все ошибки, с которыми он сталкивается, до stderr
, если вы специально не измените это.
Так работает
./main provide apps something 2> ./stderr.txt
создает текстовый файл со следующим содержимым (это то, что кобра пишет в stderr
без вашего вмешательства):
Error: app name doesnt exist
И работает ./main provide apps something > ./stdout.txt
- создает текстовый файл со следующим содержимым (вы напечатали это самостоятельно с помощью fmt.Println(err)
, вторая строка снизу в вашем коде):
app name doesnt exist
Что означает поведение по умолчанию печатает ошибки как stdout
и stderr
.
Как вам советовал Девин, изменив последнюю строку на os.Stderr.WriteString(err)
или
fmt.Fprintln(os.Stderr, err)
(тот, который я бы использовал) заставит ваш проект напечатать все до stderr
only , что означает ошибки печати дважды:
Error: app name doesnt exist
app name doesnt exist
Может быть полезно знать, что кобра позволяет вам контролировать поведение при печати ошибок. Например, вы можете указать команде кобры, в какой поток печатать:
command.SetOutput(os.Stdout) // Defaults to os.Stderr
Вы также можете предотвратить печать ошибок:
command.SilenceErrors = true
или запретить печать текста использования:
command.SilenceUsage = true