В языке программирования Go существует несколько способов читать вывод из stdout
и перенаправлять его без ожидания окончания. Ниже представлены два из них:
1. Использование пакета os/exec
:
package main import ( "fmt" "os/exec" "io" ) func main() { cmd := exec.Command("command", "arg1", "arg2", ...) // Перенаправляем `stdout` на пайп stdout, err := cmd.StdoutPipe() if err != nil { fmt.Printf("Ошибка: %v", err) return } // Запускаем команду err = cmd.Start() if err != nil { fmt.Printf("Ошибка: %v", err) return } // Выводим результаты по мере их получения go func() { io.Copy(os.Stdout, stdout) }() // Ждем, пока команда завершится err = cmd.Wait() if err != nil { fmt.Printf("Ошибка: %v", err) return } }
В этом примере мы создаем новую команду с помощью exec.Command()
, перенаправляем stdout
на пайп с помощью cmd.StdoutPipe()
, запускаем команду с помощью cmd.Start()
, и затем параллельно читаем и выводим результаты с помощью io.Copy(os.Stdout, stdout)
. После того, как команда завершится, мы вызываем cmd.Wait()
для ожидания окончания выполнения команды.
2. Использование пакета os/exec
с использованием буфера:
package main import ( "fmt" "os/exec" "bytes" ) func main() { cmd := exec.Command("command", "arg1", "arg2", ...) // Создаем буфер для хранения вывода var out bytes.Buffer // Перенаправляем `stdout` в наш буфер cmd.Stdout = &out // Запускаем команду err := cmd.Start() if err != nil { fmt.Printf("Ошибка: %v", err) return } // Ждем, пока команда завершится err = cmd.Wait() if err != nil { fmt.Printf("Ошибка: %v", err) return } // Выводим результаты fmt.Println(out.String()) }
В этом примере мы создаем новую команду с помощью exec.Command()
, создаем буфер с помощью var out bytes.Buffer
, и затем перенаправляем stdout
на этот буфер с помощью cmd.Stdout = &out
. Затем мы запускаем команду и ожидаем, пока она завершится, используя cmd.Wait()
. Наконец, мы выводим сохраненные результаты с помощью out.String()
.
Оба этих примера позволяют вам читать вывод из stdout
без ожидания окончания выполнения команды. Вы можете выбрать один из этих подходов, в зависимости от ваших потребностей и предпочтений.