Не читаются данные из pipe


Не читаются данные из pipe

28.04.2017 06:41:23 Просмотров 87 Источник

Привет. Пытаюсь прочитать данные из pipe в golang.

Делаю, как написано в примере. Всё работает:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os/exec"
)
func main() {
    cmd := exec.Command("echo", "-n", `{"Name": "Bob", "Age": 32}`)
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }
    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }
    var person struct {
        Name string
        Age  int
    }
    if err := json.NewDecoder(stdout).Decode(&person); err != nil {
        log.Fatal(err)
    }
    if err := cmd.Wait(); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s is %d years old\n", person.Name, person.Age)
}

Теперь делаю читаю непосредственно из stdout:

package main

import (
    "fmt"
    "os/exec"
    "log"
)

func main() {
    cmd := exec.Command("echo", "-n", `{"Name": "Bob", "Age": 32}`)
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }
    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }
    var data []byte
    if err := cmd.Wait(); err != nil {
        log.Fatal(err)
    }
    stdout.Read(data)
    fmt.Printf(string(data))
}

Возвращает пустой слайс. В чём причина подскажите.

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/659793/%d0%9d%d0%b5-%d1%87%d0%b8%d1%82%d0%b0%d1%8e%d1%82%d1%81%d1%8f-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d0%b8%d0%b7-pipe#comment950117_659793
Первый раз вижу golang, но очевидно, что в примере stdout читают до Wait, а вы после. Думаю, что содержимое pipe в этот момент уже утрачено (скорее всего внутри метода .Wait вызывается close с файловым дескриптором, который был ассоциирован с stdout (результатом вызова .StdoutPipe))

Ответы - Не читаются данные из pipe / Не читаются данные из pipe

Является ответом!
Ainar-G

28.04.2017 07:06:36

Если бы вы проверили ошибку от stdout.Read, вы бы поняли свою первую ошибку:

read |0: file already closed

Во-вторых, у вас пустой слайс байт, а должен быть хоть какого-то размера. Рабочий пример:

cmd := exec.Command("echo", "-n", `{"Name": "Bob", "Age": 32}`)
stdout, err := cmd.StdoutPipe()
if err != nil {
    log.Fatal(err)
}
if err := cmd.Start(); err != nil {
    log.Fatal(err)
}
data := make([]byte, 100)
_, err = stdout.Read(data)
if err != nil {
    log.Fatal(err)
}
fmt.Printf(string(data))
if err := cmd.Wait(); err != nil {
    log.Fatal(err)
}
Помочь в развитии проекта:
Закрыть X