Тип exec.Cmd

Тип exec.Cmd из пакета os/exec представляет собой структуру, описывающую внешнюю команду. Он содержит всю необходимую информацию для запуска команды: путь к исполняемому файлу, аргументы, переменные окружения, рабочий каталог, а также стандартные потоки ввода/вывода.

Структура exec.Cmd не создается напрямую, а получается с помощью функции exec.Command или exec.CommandContext. Команда может быть выполнена синхронно с помощью метода Run или асинхронно с использованием методов Start и Wait.

Синтаксис

gotype Cmd struct {
  Path     string
  Args     []string
  Env      []string
  Dir      string
  Stdin    io.Reader
  Stdout     io.Writer
  Stderr     io.Writer
  ExtraFiles   []*os.File
  SysProcAttr  *syscall.SysProcAttr
  Process    *os.Process
  ProcessState *os.ProcessState
  // содержит скрытые поля
}

Основные поля структуры:

Пример

Давайте запустим простую команду echo с аргументом и выведем результат:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("echo", "Hello, World!")
  output, err := cmd.Output()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(output))
}

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

go"Hello, World!\n"

Пример

Запустим команду с использованием контекста для ограничения времени выполнения:

gopackage main

import (
  "context"
  "fmt"
  "os/exec"
  "time"
)

func main() {
  ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  defer cancel()

  cmd := exec.CommandContext(ctx, "sleep", "5")
  err := cmd.Run()
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go"Error: signal: killed"

Команда sleep была прервана по истечении таймаута в 2 секунды.

Пример

Запустим команду с передачей данных через стандартный ввод и чтением вывода:

gopackage main

import (
  "bytes"
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("grep", "go")
  cmd.Stdin = bytes.NewBufferString("hello\ngo\nworld\n")
  var out bytes.Buffer
  cmd.Stdout = &out
  err := cmd.Run()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(out.String())
}

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

go"go\n"

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

  • функцию exec.Command,
    которая создает новый экземпляр Cmd
  • функцию exec.CommandContext,
    которая создает команду с поддержкой контекста
  • метод exec.Cmd.Run,
    который запускает команду и ожидает ее завершения
  • метод exec.Cmd.Output,
    который возвращает стандартный вывод команды