首页 > 其他分享 >标准库之exec

标准库之exec

时间:2024-03-14 16:13:08浏览次数:23  
标签:Cmd err exec fmt cmd 标准 func

目录

一、exec介绍

  • 有时候我们的go程序需要执行外部的命令,比如执行linux shell命令,一个其他语言编写的二进制文件,我们都可以通过调用go语言的exec包的函数来执行。

1. exec 函数和Cmd的方法

func Command(name string, arg ...string) *Cmd
//方法返回一个*Cmd, 用于执行name指定的程序(携带arg参数)
 
func (c *Cmd) Run() error
//执行Cmd中包含的命令,阻塞直到命令执行完成
 
func (c *Cmd) Start() error
//执行Cmd中包含的命令,该方法立即返回,并不等待命令执行完成
 
func (c *Cmd) Wait() error
//该方法会阻塞直到Cmd中的命令执行完成,但该命令必须是被Start方法开始执行的
 
func (c *Cmd) Output() ([]byte, error)
//执行Cmd中包含的命令,并返回标准输出的切片
 
func (c *Cmd) CombinedOutput() ([]byte, error)
//执行Cmd中包含的命令,并返回标准输出与标准错误合并后的切片
 
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
//返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准输入
 
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
//返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准输出
 
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
//返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准错误

二、案例

1. 只执行命令,不获取结果

func main() {
	cmd := exec.Command("ls", "-l", "/Users/liuqingzheng/")
	err := cmd.Run()
	if err != nil {
		fmt.Println("执行命令出错",err)
	}
}

2. 执行命令并获取结果

func main() {
	cmd := exec.Command("ls", "-l", "/Users/liuqingzheng/")
	res,err:=cmd.CombinedOutput()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(res))
}
func main() {
	res,err:= exec.Command("ls", "-l", "/Users/liuqingzheng/").Output()
	if err != nil {
		fmt.Println("执行出错:",err)
	}
	fmt.Println(string(res))
}

3. 执行命令,区分stdout 和 stderr

func main() {
	cmd := exec.Command("ls", "-l", "/Users/iuqingzheng/*.log")
	var stdout, stderr bytes.Buffer
	cmd.Stdout = &stdout  // 标准输出
	cmd.Stderr = &stderr  // 标准错误
	err := cmd.Run()
	outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
	fmt.Printf("标准输出:\n%s\n标准错误:\n%s\n", outStr, errStr)
	if err != nil {
		fmt.Println("执行出错:",err)
	}

}

4. 使用管道,多条命令组合

// ps aux | grep redis
func main() {
	c1 := exec.Command("ps", "aux")  // 命令1
	c2 := exec.Command("grep", "redis") // 命令2
	c2.Stdin, _ = c1.StdoutPipe() // c1的输出,作为c2.输入
	c2.Stdout = os.Stdout   // c2的输出到控制台上
	_ = c2.Start()  // c2立即启动,不等结果返回
	_ = c1.Run()  // c1阻塞直到命令执行完成
	_ = c2.Wait()  //c2阻塞直到Cmd中的命令执行完成

}

5. 设置程序级别的环境变量

func main() {

	os.Setenv("name", "lqz")
	//cmd := exec.Command("echo", os.ExpandEnv("$name"))
	cmd := exec.Command("echo", os.ExpandEnv("$name"))
	out, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Println("执行出错:",err)
	}
	fmt.Printf("%s", out)

}

//ExpandEnv根据当前环境变量的值来替换字符串中的${var}或者$var。如果引用变量没有定义,则用空字符串替换
s := "hello $GOROOT"
fmt.Println(os.ExpandEnv(s))

标签:Cmd,err,exec,fmt,cmd,标准,func
From: https://www.cnblogs.com/Mcoming/p/18073086

相关文章

  • 标准库之strings
    目录一、strings库介绍二、字符串比较-Compare1.介绍2.示例三、检测字符串是否包含子串-Contains1.介绍2.示例四、大小写转换1.介绍2.示例五、统计子字符串出现的次数1.介绍2.示例六、判断字符串的前后缀1.介绍2.示例七、分割和连接1.介绍2.示例八、索引1.介绍2.示......
  • 标准库之rand
    目录一、rand库介绍二、math/rand1.基本使用2.常用的方法3.生成定长的随机数三、crypto/rand一、rand库介绍在Go中,有两个包提供了rand,分别为math/rand和crypto/rand,对应两种应用场景math/rand包实现了伪随机数生成器。也就是生成整型和浮点型crypto/rand包实......
  • 标准库之path和filepath
    目录一、Path包1.常用函数2.示例二、filepath1.常用函数2.示例一、Path包实现的功能和python的os模块的os.path的方法类似注意:该包只对/路径有效,windows的\路径无效1.常用函数path包实现了对用斜杠进行分隔的路径进行操作的函数funcIsAbs(pathstring)bool//......
  • 标准库之context(很重要)
    目录标准库之context一、为什么需要context1.基本并发的示例2.全局变量方式的并发3.通道方式的并发4.官方版的方案二、Context初识1.Context接口2.两个顶级Context(1)Background()和TODO()(2)区别3.派生Context(With系列函数)(1)WithCancel(可取消context)i.context控制goroutin......
  • 第四章 python的标准库
    第四章python的标准库一、`os`1.1基本功能1.2文件和目录操作1.2.1目录操作1.2.2文件操作1.3路径操作1.4环境变量1.4.1`os.environ`1.4.2`os.pathsep`1.4.3`os.name`1.4.4`os.system()`1.4.5`os.putenv(key,value)`和`os.unsetenv(key)`1.5进程管理1.5......
  • Rust 标准库 Trait 指南
    部分内容来自Rust2021年期刊内容目录引言Trait基础自动Trait泛型Trait格式化Trait操作符Trait转换Trait错误处理迭代器TraitI/OTrait总结引言你是否曾想过下面这些trait有什么不同?Deref<Traget=T>,AsRef<T>,以及Borrow<T>?Clone,Copy,和ToOwned?From......
  • 单据类型参数设置增加自定义参数并通过BOS标准函数调用
     1、BOS函数说明2、创建对应单据的【单据类型参数】,继承自【单据类型参数模版】。 3、在单据参数中绑定【单据类型参数对象】 4、参数设置设置对应参数 5、在BOS中调用标准函数进行使用。 ......
  • STM32标准库低功耗
    STM32标准库低功耗1.睡眠模式1.1.进入以及退出方法睡眠模式较为简单,仅需要简单调用函数即可,且函数定义处于内核层,不需要引用多余的头文件。睡眠模式:仅内核停止,所有外设仍旧运行。调用"__WFI()"函数,退出方式为任意中断。调用"__WFE()"函数,退出方式为唤醒事件。2.停......
  • 详解Go程序添加远程调用tcpdump功能,exec.Command("sh", "-c", "ps -elf | grep xxx |
    摘自:https://www.jb51.net/article/249001.htm这篇文章主要介绍了go程序添加远程调用tcpdump功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用......
  • golang,再也不用管道了,exec.Command("bash", "-c", "ps -elf | grep xxx")
    摘自:https://www.jb51.net/article/249001.htmfuncSystem_CmdCombinedOutput(cmd_linestring)([]byte,error){mutex_exec.Lock()defermutex_exec.Unlock()//old_handler:=C.set_SIGCHLD_DFL()//自己实现,用c语言保存当前的信号屏蔽字//def......