使用StdoutPipe时将Stdout保存到变量

时间:2018-09-25 10:50:31

标签: go

我正在尝试使用Go运行包含管道的命令,然后将命令的输出保存到一个变量中以供以后使用。下面的代码将检索要上传到Amazon S3的最新文件的文件名,并将其输出到终端。这样做的目的是使文件名以后可以用来生成项目。密钥:

package main

import (
    "os"
    "os/exec"
)

func main() {
    c1 := exec.Command("aws", "s3", "ls", "bucket", "--recursive")
    c2 := exec.Command("sort")
    c3 := exec.Command("tail", "-n", "1")
    c4 := exec.Command("awk", "{print $4}")
    c2.Stdin, _ = c1.StdoutPipe()
    c3.Stdin, _ = c2.StdoutPipe()
    c4.Stdin, _ = c3.StdoutPipe()
    c4.Stdout = os.Stdout
    _ = c4.Start()
    _ = c3.Start()
    _ = c2.Start()
    _ = c1.Run()
    _ = c2.Wait()
    _ = c3.Wait()
    _ = c4.Wait()
}

除了要将文件名输出到终端,也不想将其输出到终端,我想将输出保存到变量。

有人知道从哪里开始吗?

1 个答案:

答案 0 :(得分:4)

您可以将任何io.Writer分配给Stdout。因此,如果要将输出存储到变量中,最简单的方法可能是:

out := &bytes.Buffer{}
c4.Stdout = out

然后将输出存储到输出中,这可以通过调用out.Bytes()out.String()来调用[]bytestring来获得。

要使输出也流到屏幕,io.MultiWriter可以提供帮助。调用写入时,它会写入所有给定的编写器。因此,您可以这样做:

out := &bytes.Buffer{}
c4.Stdout = io.MultiWriter(out, os.Stdout)