Функция exec.Command

Функция exec.Command подготавливает команду для выполнения в операционной системе. Она принимает имя исполняемого файла и его аргументы, возвращая указатель на структуру exec.Cmd. Первый параметр - это имя команды или путь к исполняемому файлу, последующие параметры - это аргументы для команды. Важно помнить, что функция только готовит команду, но не запускает её. Для фактического выполнения необходимо вызвать один из методов структуры exec.Cmd, таких как Run, Output или CombinedOutput.

Синтаксис

goexec.Command(name string, arg ...string) *exec.Cmd

Базовый пример

Давайте выполним команду echo с аргументом "Hello, World!" и выведем результат:

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"

Пример с несколькими аргументами

Давайте выполним команду ls с флагами -la для вывода содержимого текущей директории:

gopackage main

import (
  "fmt"
  "os/exec"
)

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

Результат выполнения кода (зависит от содержимого директории):

go"total 0\ndrwxr-xr-x  ..."

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

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

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("nonexistentcommand")
  err := cmd.Run()
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go"Error: exec: \"nonexistentcommand\": executable file not found in $PATH"

Пример с использованием CombinedOutput

Давайте выполним команду, которая выводит данные как в stdout, так и в stderr, используя метод CombinedOutput:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("sh", "-c", "echo stdout && echo stderr >&2")
  output, err := cmd.CombinedOutput()
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Println(string(output))
}

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

go"stdout\nstderr\n"

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

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