Чтение 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.