我正在尝试使用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()
}
除了要将文件名输出到终端,也不想将其输出到终端,我想将输出保存到变量。
有人知道从哪里开始吗?
答案 0 :(得分:4)
您可以将任何io.Writer
分配给Stdout
。因此,如果要将输出存储到变量中,最简单的方法可能是:
out := &bytes.Buffer{}
c4.Stdout = out
然后将输出存储到输出中,这可以通过调用out.Bytes()
或out.String()
来调用[]byte
或string
来获得。
要使输出也流到屏幕,io.MultiWriter
可以提供帮助。调用写入时,它会写入所有给定的编写器。因此,您可以这样做:
out := &bytes.Buffer{}
c4.Stdout = io.MultiWriter(out, os.Stdout)