Тип exec.Cmd
Тип exec.Cmd из пакета os/exec представляет собой структуру, описывающую внешнюю команду. Он содержит всю необходимую информацию для запуска команды: путь к исполняемому файлу, аргументы, переменные окружения, рабочий каталог, а также стандартные потоки ввода/вывода.
Структура exec.Cmd не создается напрямую, а получается с помощью функции exec.Command или exec.CommandContext. Команда может быть выполнена синхронно с помощью метода Run или асинхронно с использованием методов Start и Wait.
Синтаксис
type 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
// содержит скрытые поля
}
Основные поля структуры:
Path— путь к исполняемому файлуArgs— аргументы командной строкиEnv— переменные окруженияDir— рабочий каталогStdin,Stdout,Stderr— потоки ввода/вывода
Пример
Давайте запустим простую команду echo с аргументом и выведем результат:
package 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))
}
Результат выполнения кода:
"Hello, World!\n"
Пример
Запустим команду с использованием контекста для ограничения времени выполнения:
package 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)
}
}
Результат выполнения кода:
"Error: signal: killed"
Команда sleep была прервана по истечении таймаута в 2 секунды.
Пример
Запустим команду с передачей данных через стандартный ввод и чтением вывода:
package 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\n"
Смотрите также
-
функцию
exec.Command,
которая создает новый экземплярCmd -
функцию
exec.CommandContext,
которая создает команду с поддержкой контекста -
метод
exec.Cmd.Run,
который запускает команду и ожидает ее завершения -
метод
exec.Cmd.Output,
который возвращает стандартный вывод команды