首页 > 解决方案 > 使用 StdoutPipe 时将 Stdout 保存到变量

问题描述

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

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()
}

除了将文件名输出到终端之外,我还想将输出保存到变量中。

有人知道从哪里开始吗?

标签: go

解决方案


您可以将 any 分配io.WriterStdout. 因此,如果您想将输出存储到变量中,最简单的方法可能是:

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

然后将输出存储在 out 中,可以通过调用out.Bytes()out.String()根据您想要 a[]byte或 a来获取string

还可以将输出流式传输到屏幕上,这io.MultiWriter会有所帮助。当调用 write 时,它​​会写入所有给定的 writer。所以你可以这样做:

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

推荐阅读