Метод exec.Cmd.CombinedOutput

Метод exec.Cmd.CombinedOutput выполняет команду, которую вы настроили через структуру exec.Cmd, и возвращает результат выполнения в виде среза байтов, содержащего как стандартный вывод, так и вывод ошибок. Этот метод полезен, когда вам нужно получить весь вывод команды без разделения на stdout и stderr. Метод запускает команду, ожидает ее завершения и возвращает объединенный вывод. В случае ошибки выполнения команды возвращается ошибка типа *exec.ExitError.

Синтаксис

gofunc (c *Cmd) CombinedOutput() ([]byte, error)

Пример простой команды

Давайте выполним простую команду echo и получим объединенный вывод:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("echo", "Hello, World!")
  res, err := cmd.CombinedOutput()
  if err != nil {
    fmt.Printf("Error: %v\n", err)
    return
  }
  fmt.Printf("%q", string(res))
}

Результат выполнения кода:

go"Hello, World!\n"

Пример с выводом ошибок

Давайте выполним команду, которая вызывает ошибку, и посмотрим на объединенный вывод, содержащий сообщение об ошибке:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("ls", "/nonexistent")
  res, err := cmd.CombinedOutput()
  if err != nil {
    fmt.Printf("Command failed: %v\n", err)
  }
  fmt.Printf("%q", string(res))
}

Результат выполнения кода:

go"ls: cannot access '/nonexistent': No such file or directory\n"

Пример с обработкой ошибки

Давайте обработаем ошибку выполнения команды и проверим код завершения:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("false")
  res, err := cmd.CombinedOutput()
  if err != nil {
    if exitErr, ok := err.(*exec.ExitError); ok {
      fmt.Printf("Exit code: %d\n", exitErr.ExitCode())
    }
    fmt.Printf("Error: %v\n", err)
  }
  fmt.Printf("Output: %q", string(res))
}

Результат выполнения кода:

go"Exit code: 1\nError: exit status 1\nOutput: \"\""

Смотрите также

  • метод exec.Cmd.Run,
    который выполняет команду без получения вывода
  • метод exec.Cmd.Output,
    который возвращает только стандартный вывод команды
  • метод exec.Cmd.Start,
    который запускает команду асинхронно
  • метод exec.Cmd.Wait,
    который ожидает завершения команды