Как читать stdout и stderr из процесса запущенного через cmd.Command?

Чтение stdout и stderr из процесса, запущенного через cmd.Command, осуществляется путем присоединения к каналам stdout и stderr команды. Для этого необходимо выполнить несколько шагов.

Шаг 1: Создайте команду cmd.Command с необходимыми аргументами и настройками. Например, чтобы запустить команду "ls -l" в операционной системе Linux, вы можете использовать следующий код:

command := exec.Command("ls", "-l")

Заметьте, что этот код создает объект Cmd, который представляет команду без ее выполнения.

Шаг 2: Создайте каналы для чтения stdout и stderr. В Go для этого можно использовать пакет io/ioutil. Например:

stdout, err := command.StdoutPipe()
if err != nil {
    log.Fatal(err)
}

stderr, err := command.StderrPipe()
if err != nil {
    log.Fatal(err)
}

Шаг 3: Запустите команду вызовом метода Start() для выполнения команды. Например:

if err := command.Start(); err != nil {
    log.Fatal(err)
}

Шаг 4: Прочтите вывод stdout и stderr из каналов. Для этого можно использовать функцию ioutil.ReadAll(). Например:

stdoutBytes, err := ioutil.ReadAll(stdout)
if err != nil {
    log.Fatal(err)
}

stderrBytes, err := ioutil.ReadAll(stderr)
if err != nil {
    log.Fatal(err)
}

Шаг 5: Дождитесь завершения команды вызовом метода Wait(). Например:

if err := command.Wait(); err != nil {
    log.Fatal(err)
}

После выполнения всех этих шагов, переменная stdoutBytes будет содержать вывод stdout команды, а переменная stderrBytes - вывод stderr.

Ниже приведен полный пример кода, демонстрирующий чтение stdout и stderr из процесса, запущенного через cmd.Command:

package main

import (
    "io/ioutil"
    "log"
    "os/exec"
)

func main() {
    command := exec.Command("ls", "-l")

    stdout, err := command.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    stderr, err := command.StderrPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err := command.Start(); err != nil {
        log.Fatal(err)
    }

    stdoutBytes, err := ioutil.ReadAll(stdout)
    if err != nil {
        log.Fatal(err)
    }

    stderrBytes, err := ioutil.ReadAll(stderr)
    if err != nil {
        log.Fatal(err)
    }

    if err := command.Wait(); err != nil {
        log.Fatal(err)
    }

    log.Println("stdout:", string(stdoutBytes))
    log.Println("stderr:", string(stderrBytes))
}

Этот код запускает команду "ls -l" и выводит ее stdout и stderr в консоль.

Надеюсь, что это поможет вам получить stdout и stderr из процесса, запущенного через cmd.Command в Go.