将cmd stdout和stderr作为字符串返回,而不是在golang中打印到控制台

将cmd stdout和stderr作为字符串返回,而不是在golang中打印到控制台,第1张

概述我正在从golang应用程序执行bash命令.现在stdout和stderr直接进入控制台: cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr 但我希望stdout和stderr作为字符串变量从runBashCommandAndKillIfTooSlow函数返回,而不立即打印到控制台. 怎么实现这个? 代码: package mainimport ( 我正在从golang应用程序执行bash命令.现在stdout和stderr直接进入控制台:
cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr

但我希望stdout和stderr作为字符串变量从runBashCommandAndKillifTooslow函数返回,而不立即打印到控制台.
怎么实现这个?

代码:

package mainimport (    "fmt"    "log"    "os"    "os/exec"    "time")func main() {    ok,outString,errString := runBashCommandAndKillifTooslow("ls -la",2000)    fmt.Println("ok")    fmt.Println(ok)    fmt.Println("outString")    fmt.Println(outString)    fmt.Println("errString")    fmt.Println(errString)}/*run bash command and kill it if it works longer than "killinMilliSeconds" milliseconds*/func runBashCommandAndKillifTooslow(command string,killinMilliSeconds time.Duration) (okResult bool,stdout,stderr string) {    fmt.Println("running bash command...")    fmt.Println(command)    cmd := exec.Command("sh","-c",command)    cmd.Stdout = os.Stdout // cmd.Stdout -> stdout    cmd.Stderr = os.Stderr // cmd.Stderr -> stderr    okResult = true    err := cmd.Start()    log.Printf("Waiting for command to finish...")    done := make(chan error,1)    go func() {        done <- cmd.Wait()    }()    select {    case <-time.After(killinMilliSeconds * time.Millisecond):        if err := cmd.Process.Kill(); err != nil {            log.Fatal("Failed to kill: ",err)            okResult = false        }        <-done // allow goroutine to exit        // log.Println("process killed")    case err := <-done:        if err != nil {            log.Printf("process done with error = %v",err)            okResult = false        }    }    if err != nil {        log.Fatal(err)        okResult = false    }    return}

顺便说一下,如果程序太慢(killinMilliSeconds参数),程序应该保留杀死bash命令的能力.

将输出设置为 bytes.Buffer:
var outbuf,errbuf bytes.Buffercmd.Stdout = &outbufcmd.Stderr = &errbuf

运行该命令后,可以通过调用Buffer.String()方法将stdout和stderr作为字符串获取:

stdout := outbuf.String()stderr := errbuf.String()
总结

以上是内存溢出为你收集整理的将cmd stdout和stderr作为字符串返回,而不是在golang中打印到控制台全部内容,希望文章能够帮你解决将cmd stdout和stderr作为字符串返回,而不是在golang中打印到控制台所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1293780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存