gpt4 book ai didi

linux - 有没有一种方法可以将bash脚本中的stdout存储到GO中的变量中?

转载 作者:行者123 更新时间:2023-12-01 22:12:57 25 4
gpt4 key购买 nike

我正在运行一个非常简单的bash脚本,该脚本仅在Go中回显了一些数据。我将其放入包装器并使用exec程序包执行此操作。通过输出到我的终端可以很好地工作,但是,我找不到任何将其实际存储到Go变量中的方法。

我是Go的新手,所以我的调试技能并不出色。但是,我放置了一些基本的日志记录输出,以尝试缩小我确切需要从中获取输出的位置,但无济于事。

运行bash的两个函数:

func main(){
_, result,_ := runBash()
log.Printf("Result: ", result)
}


func runBash()(bool, string, string){
cmd := exec.Command("/bin/sh", "-s")
cmd.Stdin = strings.NewReader(replicateRouter())
return finishRunning(cmd)
}

func finishRunning(cmd *exec.Cmd) (bool, string, string) {
log.Printf("Running: ")
stdout, stderr := bytes.NewBuffer(nil), bytes.NewBuffer(nil)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
done := make(chan struct{})
defer close(done)
go func() {
for {
select {
case <-done:
return
case s := <-signals:
cmd.Process.Signal(s)
}
}
}()
log.Printf("Flag 1")
if err := cmd.Run(); err != nil {
log.Printf("Error running %v", err)
return false, string(stdout.Bytes()), string(stderr.Bytes())
}
log.Printf("Flag 2")
return true, string(stdout.Bytes()), ""
}

这是用来伪造我的bash脚本的函数:

func replicateRouter() string{
return `echo <HOSTNAME> <IP> <MACADDRESS>`
}

当我尝试从cmd / stdout记录任何值时,回声发生在标志1和2之间以及任何时候,我得到的都是空字符串。在主函数中,结果变量产生: 2020/06/19 18:17:14 Result: %!(EXTRA string=)
所以我想我的第一个问题是为什么结果(理论上是string(stdout.Bytes()))不产生回声? &其次,在哪里/如何将输出保存到变量?

谢谢,如果我有任何疑问和/或需要更多详细信息,请随时与我联系

- 编辑:
还忘了提及,该代码在很大程度上受到 this Kubernetes go脚本的启发。如果有任何建议/批评这样做,我真的很高兴听到/学习:)

最佳答案

问题1:

在您的代码中,永远不会将stdout和stderr分配给cmd。

尝试这个:

cmd.Stdout = stdout
cmd.Stderr = stderr

或者,尝试使用以下简单版本:
  func main() {
out, err := exec.Command("date").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf("The date is %s\n", out)
}

最后,您可以“代理”到os.Stdout
package main

import (
"bytes"
"fmt"
"os/exec"
"io"
"os"
)


func main() {
stdout := new(bytes.Buffer)
stderr := new(bytes.Buffer)
_, _ = io.Copy(os.Stdout, stdout)
_, _ = io.Copy(os.Stderr, stderr)

cmd := exec.Command("date")
cmd.Stdout = stdout
cmd.Stderr = stderr
cmd.Run()



output := string(stdout.Bytes())
fmt.Printf("The date is %s\n", output)
}

关于linux - 有没有一种方法可以将bash脚本中的stdout存储到GO中的变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62475548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com