Как я могу использовать gzip в go для сжатия из команды, использующей stdoutpipe? - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь понять, как использовать сжатие (gzip) для процессов, которые должны записать в допустимый канал, все в процессе.

Если канал не обнаружен, включающий процесс выдаст ошибку, заявив, чтотруба сломана.Так что, насколько я могу судить, у меня есть для использования StdoutPipe?

В этом примере я просто пытаюсь сжать вывод из echo.

package main

import (
    "compress/gzip"
    //  "fmt"
    "io"
    "os"
    "os/exec"
)

func main() {
    f, _ := os.Create("/tmp/local_test.gz")

    cmd := exec.Command("echo", "my\nstrings\nare\nfancy")

    r, w := io.Pipe()
    gzw := gzip.NewWriter(w)

    out, _ := cmd.StdoutPipe()

    cmd.Start()

    go func() {
        // copy stdoutpipe to gz writer?
        io.Copy(w, out)
        gzw.Close()
        w.Close()
    }()

    // copy pipe to file?
    io.Copy(f, r)
}

Файл написан, но не в формате gzip?

$ file /tmp/local_test.gz
/tmp/local_test.gz: data
$ gunzip /tmp/local_test.gz
gunzip: /tmp/local_test.gz: not in gzip format

1 Ответ

3 голосов
/ 23 сентября 2019

ваши конвейеры бесполезно сложны, не забудьте их промыть и закрыть, помните, что отсрочка - это lifo.

Вам нужно только обернуть f writer в gzip writer, чем скопировать stdout в writer.

package main

import (
    "compress/gzip"
    "io"
    "os"
    "os/exec"
)

func main() {
    os.Remove("local_test.gz")
    f, _ := os.Create("local_test.gz")
    defer f.Close()

    cmd := exec.Command("echo", "my\nstrings\nare\nfancy")

    gzw := gzip.NewWriter(f)
    defer gzw.Close()
    defer gzw.Flush()

    out, _ := cmd.StdoutPipe()

    cmd.Start()

    io.Copy(gzw, out)

    // cmd.Wait() // to catch processing errors    
}

проверка результата

$ file local_test.gz 
local_test.gz: gzip compressed data, original size 21
$ cat local_test.gz | gunzip -c
my
strings
are
fancy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...