Go语言执行系统命令

本文介绍了如何在Go语言中使用os/exec包执行系统命令。通过exec.Command()创建结构体并利用cmd.Start()或cmd.Run()执行命令。cmd.Run()会阻塞直到命令完成,而cmd.Start()允许后台执行。cmd.Output()提供方便地获取命令输出,内部利用bytes.Buffer存储结果,体现了Go语言的组合设计思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码

获取命令行输出

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("echo", "hello")
    buf, _ := cmd.Output()          // 错误处理略

    print(string(buf))
}

后台运行

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("sleep", "100")
    cmd.Start()
}

分析

os/exec 包用来调用系统命令,并处理输入输出。

exec.Command() 用于创建一个 exec.cmd 结构体,并将传入的参数保存到结构体中。

结构体创建完成后,可以使用 cmd.Start() 或 cmd.Run() 执行。其中,cmd.Run() 会阻塞当前进程,直到命令执行完成。而 cmd.Start() 会保持程序在后台执行,在需要获取结果时,可以调用 cmd.Wait() 来阻塞以获取结果。

cmd.Run() 的实现代码如下:

func (c *Cmd) Run() error {
    if err := c.Start(); err != nil {
        return err
    }
    return c.Wait()
}

cmd.Output() 是一个工具函数,它实际上是对 cmd.Run() 的简单包装,可以自动处理 cmd.Stdout 并返回结果。也就是说,不用关心 cmd.Stdout 的设置,只需创建 cmd 并调用 cmd.Output() 获取执行结果即可。

cmd.Output() 的部分代码如下(有删减):

func (c *Cmd) Output() ([]byte, error) {
    var stdout bytes.Buffer
    c.Stdout = &stdout

    // ...

    err := c.Run()
    // ...
    return stdout.Bytes(), err
}

可见,系统使用了 bytes.Buffer 来临时存放输出结果,并在方法结束时将输出结果返回。bytes.Buffer 实现了 io.Reader 和 io.Writer,此处同样可以看出go语言面向组合的设计思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值