go - 使用 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()
}
除了将文件名输出到终端之外,我还想将输出保存到变量中。
有人知道从哪里开始吗?
解决方案
您可以将 any 分配io.Writer
给Stdout
. 因此,如果您想将输出存储到变量中,最简单的方法可能是:
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)
推荐阅读
- python - 如何从有条件的字典列表中提取字典
- c++ - 如何在 Qt 中旋转 QGraphicsPixmapItem
- java - 使用 while 循环倒数并找到平方根
- wpf - ModernWPFUI NugetPackage 'ThemeResources/XamlControlsResources' 在当前上下文中不存在/找不到 NuGet 包
- spring - 动态 JPA 查询
- c# - 在 .NET 核心应用程序的 Docker 容器中找不到 package.json
- python - 将多个字符串转换为整数
- flutter - 为什么脚手架的背景会出现一个巨大的灰色圆圈?
- swift - Swift - 物体检测中带有设备旋转的相机
- influxdb - InfluxDB:flux 是在查询中将简单计算添加为列的唯一方法吗?