go语言将cmd stdout和stderr作为字符串返回而不是打印到控制台

这篇具有很好参考价值的文章主要介绍了go语言将cmd stdout和stderr作为字符串返回而不是打印到控制台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

go语言将cmd stdout和stderr作为字符串返回而不是打印到控制台

1、直接打印到控制台

从 golang 应用程序中执行 bash 命令,现在 stdout 和 stderr 直接进入控制台:

cmd.Stdout = os.Stdout 
cmd.Stderr = os.Stderr
package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"time"
)

func main() {
	ok, outString, errString := runBashCommandAndKillIfTooSlow("dir", 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)
	// Linux
	// cmd := exec.Command("sh", "-c", command)
	// Windows
	cmd := exec.Command("cmd", "/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
		}
		// allow goroutine to exit
		<-done
		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
}

如果 bash 命令太慢( killInMilliSeconds 参数),程序应该保持其终止 bash 命令的能力。

希望 stdout 和 stderr 作为字符串变量从 runBashCommandAndKillIfTooSlow 函数返回,而不立即打印到控

制台,如何实现。

2、不打印到控制台

将输出设置为 strings.Builder 或 bytes.Buffer:

var outbuf, errbuf strings.Builder // or bytes.Buffer
cmd.Stdout = &outbuf
cmd.Stderr = &errbuf

运行命令后,您可以通过调用 Builder.String() 获取字符串形式的标准输出和标准错误:文章来源地址https://www.toymoban.com/news/detail-819052.html

stdout := outbuf.String()
stderr := errbuf.String()
package main

import (
	"fmt"
	"log"
	"os/exec"
	"strings"
	"time"
)

func main() {
	ok, outString, errString := runBashCommandAndKillIfTooSlow("dir", 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)
	// Linux
	// cmd := exec.Command("sh", "-c", command)
	// Windows
	cmd := exec.Command("cmd", "/C", command)
	var outBuf, errBuf strings.Builder // or bytes.Buffer
	cmd.Stdout = &outBuf
	cmd.Stderr = &errBuf
	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
		}
		// allow goroutine to exit
		<-done
		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
	}
	stdout = outBuf.String()
	stderr = errBuf.String()
	return
}

到了这里,关于go语言将cmd stdout和stderr作为字符串返回而不是打印到控制台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 语言内置类型全解析:从布尔到字符串的全维度探究

    关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 本文深入

    2024年02月09日
    浏览(51)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(64)
  • 题目:1967.作为子字符串出现在单词中的字符串数组

    ​ 题目来源:         leetcode题目,网址:1967. 作为子字符串出现在单词中的字符串数目 - 力扣(LeetCode) 解题思路:         遍历字符串数组,根据 word.indexOf(pattern) 的返回值是否为 -1 判断改字符串是否为单词的字符串并对其计数即可。 解题代码: 总结:         官方

    2024年02月13日
    浏览(51)
  • 如何将后端带过来的字符串通过‘,’号作为判断依据,分割字符串然后生成数组

    在实际开发工程中我们会遇到我们调用后端接口获取图片、文件、视频甚至选择的对象时,如果是这样的: 这种数据类型如果想渲染在html中的话就会很麻烦,我们可以通过\\\",\\\"号为切割点将它放入数组中,通过列表进行渲染 由于实际项目中的数据很多可能说起来会很乱,所以

    2024年01月20日
    浏览(53)
  • 使用 Python 从作为字符串给出的数字中删除前导零

    使用的方法 以下是用于完成此任务的各种方法 - 使用 For 循环和 remove() 函数 使用正则表达式 使用 int() 函数 算法(步骤) 以下是执行所需任务要遵循的算法/步骤。− 创建一个函数 deleteLeadingZeros(),该函数从作为字符串传递给函数的数字中删除前导零。 使用 for

    2024年02月07日
    浏览(71)
  • 一个退役中校教你如何用go语言写一个基于B+树的json数据库(进阶篇)之json字符串解析为BsTr结构(一)

    1.对象式json字符串 s := \\\"{\\\"put\\\":{\\\"putjsontest\\\":{\\\"aaa\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"aaab\\\":true,\\\"arrarrstrct\\\":{\\\"nnn\\\":-1234567890,\\\"ccc\\\":[[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"nmbndfvdfgfdg\\\"],[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"poiuiyyttt\\\"]]},\\\"ddd\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"fff\\\":false,\\\"comboolarr\\\":[{\\\"boolarr0\\\":[true,false]},{\\\"boolarr1\\\":[true,false]}]}

    2024年02月21日
    浏览(52)
  • go字符串详解

    go字符串结构体包含:指向底层存储数组的指针、字符串长度。字符串按utf-8将字符编码成二进制数,然后存储在byte数组中。因为utf-8编码一个字符可能占用多个字节,例如一个汉字占3个字节,所以字符串中的一个字符可能对应byte数组中的多个元素。为了让一个字符对应数组

    2024年02月09日
    浏览(52)
  • Go字符串实战操作大全!

    在本篇文章中,我们深入探讨了Go语言中字符串的魅力和深度。从基础定义、操作、字符编码到复杂的类型转换,每个环节都带有实例和代码示例来深化理解。通过这些深入的解析,读者不仅能够掌握字符串在Go中的核心概念,还能洞察Go设计哲学背后的思考。 关注公众号【

    2024年02月08日
    浏览(40)
  • go字符串去除首尾所有换行符

    原创不易,如果对你有帮助,欢迎给作者点个赞哦! 一键开启舒适、快捷: 调用: 效果:

    2024年02月13日
    浏览(49)
  • 【Go基础】编译、变量、常量、基本数据类型、字符串

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 使用 go build 1.在项目目录下执行 2.在其他路径下编译 go build ,需要再后面加上项目的路径(项目路径从GOPATH/src后开始写起,编译之后的可执行文件就保存再当前目录) 3.打包的时候自定义名字:

    2024年02月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包