当前位置: 首页 > 面试题库 >

在Go中实时打印exec命令中的stdout

姜增
2023-03-14
问题内容

我有一个小的Go工具,该工具基本上允许用户定义一个命令,该命令将使用来运行os/exec

我的问题是我想向用户显示命令的输出(stdout / stderr)。

一个示例可能看起来像这样:用户定义一个命令,最后是sh test.shtest.sh的 内容:

echo "Start"
sleep 7s
echo "Done"

在我当前的实现中,用户仅在完成完整命令后才能看到输出。在上面的示例中,用户直到命令和第二次完成才看到输出 Startsleep``echo

我目前正在检索命令的输出,如下所示:

cmd := exec.Command(command, args...)
cmd.Dir = dir
// Attach to the standard out to read what the command might print
stdout, err := cmd.StdoutPipe()
if err != nil {
    log.Panic(err)
}
// Execute the command
if err := cmd.Start(); err != nil {
    log.Panic(err)
}

buf := new(bytes.Buffer)
buf.ReadFrom(stdout)
log.Print(buf.String())

是否有可能 实时 读取stdout / stderr 。就是说,一旦用户定义的命令创建并输出,它就会被打印吗?


问题答案:

谢谢mh-cbon。那把我推向正确的方向。

现在的代码看起来像这样,并且完全按照我的意愿去做。我还发现,当我使用Run()而不是Start()执行程序时,仅在命令完成后才继续执行。

cmd := exec.Command(command, args...)
cmd.Dir = dir

var stdBuffer bytes.Buffer
mw := io.MultiWriter(os.Stdout, &stdBuffer)

cmd.Stdout = mw
cmd.Stderr = mw

// Execute the command
if err := cmd.Run(); err != nil {
    log.Panic(err)
}

log.Println(stdBuffer.String())


 类似资料:
  • 问题内容: 在熟悉Go和goroutine的过程中,我遇到了执行命令的障碍。这些命令的格式为: 使用从如何在Golang中执行系统命令的代码中获取未知参数的代码,我试图执行此命令,但是我相信由于第一个参数为sudo,该命令未执行,这可能是错误的。我只有两个问题。 当这些命令无法运行时,我将返回“退出状态1”,是否有办法比我正在执行的操作得到更详细的错误?问题二,为什么我使用此脚本会获得“退出状态1

  • 问题内容: 我正在尝试从go调用git日志,并将输出重定向到给定的文件。 失败于 直接在bash中执行命令没有问题。 问题答案: Go的行为类似于C 和启动新程序的过程。这 并不是 隐式调用Shell,从安全性的角度来看,这是一件非常好的事情。不必要的外壳程序调用通常会导致命令注入漏洞。 如果您 想要 外壳程序可以添加的功能(此处为重定向和复合命令语法),但又想避免安全风险,请从代码中将数据带外传

  • 我正在寻找一个库或代码段,它允许(漂亮地)打印结构实例的内容,而不是它的结构。以下是一些代码和预期输出: 将打印(此或类似): 请注意,我知道,但我不想漂亮地打印数据,我只需要结构的定义。

  • Selenese 有一个简单的命令可以在测试时打印输出文本。当测试在运行时,在控制台中打印显示测试中的信息,这个功能往往是非常有用的。这些信息可以用来提供测试上下文的结果报告,当你在测试中发现问题时,这个结果报告经常用来报告测试页面时发现的缺陷。最后,还可以使用 echo 语句打印 Selenium 变量的内容。

  • 问题内容: 我想获取一个输出,这是我的代码: 如何获得打印输出的内容?我如何得到类似的东西: 问候和感谢。 问题答案: 我和Frédéric有着相同的想法,但是我写了一个上下文管理器来处理替换stdout:

  • 问题内容: 我正在尝试在Java程序中打印我的mac的[edit:Apple computer]序列号。我熟悉Unix命令 在终端中完成此任务。 当我尝试 我的序列号未打印。而是打印: 我认为问题是这并不意味着要使用整个命令字符串。Java中是否有类似于shell = Truepython中的参数的东西,可以让我传递整个命令字符串? 问题答案: 我看到两种可能性: 解析使用Scanner的输出。