1 Star 0 Fork 0

cgutech-golang/core

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
cmd.go 3.98 KB
一键复制 编辑 原始数据 按行查看 历史
// Copyright 2019 Yang ZhongXi
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package core
import (
"bufio"
"bytes"
"io"
"os/exec"
"regexp"
)
func init() {
}
// SingleCmdRunner 单条指令执行器
type SingleCmdRunner struct {
cmd string
param string
strtool *regexp.Regexp
}
// CmdRunner 操作系统指令执行器,支持多条
type CmdRunner struct {
cmds []*SingleCmdRunner
}
// NewSingleCmdRunner 实例化单指令执行器。cmd - 指令, param - 参数
func NewSingleCmdRunner(cmd string, param string) *SingleCmdRunner {
strtool, _ := regexp.Compile(`\s+`)
return &SingleCmdRunner{cmd: cmd, param: param, strtool: strtool}
}
// NewCmdRunner 实例化
func NewCmdRunner(cmd []string, params []string) *CmdRunner {
var cmds []*SingleCmdRunner
for i, c := range cmd {
cmds = append(cmds, NewSingleCmdRunner(c, params[i]))
}
return &CmdRunner{cmds: cmds}
}
// Run 执行指令。
// 返回参数1-标准输出,返回参数2-标准错误输出,参数3-错误信息
func (runner *SingleCmdRunner) Run() (string, string, error) {
var stdout bytes.Buffer
var stderr bytes.Buffer
// 使用正则分割参数字符串
cmd := exec.Command(runner.cmd, runner.strtool.Split(runner.param, -1)...)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return stdout.String(), stderr.String(), err
}
// RealRun 执行指令,实时输出,执行完之后,函数返回
// receiver - 执行指令回调:参数1-标准输出,参数2-错误输出,参数3-执行错误
func (runner *SingleCmdRunner) RealRun(receiver func(string, string, error)) error {
var cmd *exec.Cmd
if len(runner.param) != 0 {
cmd = exec.Command(runner.cmd, runner.strtool.Split(runner.param, -1)...)
} else {
cmd = exec.Command(runner.cmd)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
receiver("", "", err)
return err
}
defer stdout.Close()
stderr, err := cmd.StderrPipe()
if err != nil {
receiver("", "", err)
return err
}
defer stderr.Close()
err = cmd.Start()
if err != nil {
receiver("", "", err)
return err
}
// 在线程中处理标准错误输出
go func() {
reader := bufio.NewReader(stderr)
for {
line, err := reader.ReadString('\n')
if err != nil {
if io.EOF != err {
// 如果不是执行完毕,返回错误信息
receiver("", "", err)
}
break
}
receiver("", line, nil)
}
}()
reader := bufio.NewReader(stdout)
for {
line, err := reader.ReadString('\n')
if err != nil {
if io.EOF != err {
// 如果不是执行完毕,返回错误信息
receiver("", "", err)
}
break
}
receiver(line, "", nil)
}
return err
}
// Run 同步方式执行,只有执行完毕之后才会返回结果
// 返回参数1-标准输出,返回参数2-标准错误输出,参数3-错误信息
func (runner *CmdRunner) Run() ([]string, []string, []error) {
var stdouts []string
var stderrs []string
var errs []error
for _, cmd := range runner.cmds {
stdout, stderr, err := cmd.Run()
stdouts = append(stdouts, stdout)
stderrs = append(stderrs, stderr)
errs = append(errs, err)
}
return stdouts, stderrs, errs
}
// RealRun 执行指令,实时输出,执行完之后,函数返回
// receiver - 执行指令回调:参数1-指令序号,从0开始,参数2-标准输出,参数3-错误输出,参数4-执行错误
func (runner *CmdRunner) RealRun(receiver func(int, string, string, error)) {
for i, cmd := range runner.cmds {
cmd.RealRun(func(stdout string, stderr string, err error) {
receiver(i, stdout, stderr, err)
})
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cgutech-golang/core.git
git@gitee.com:cgutech-golang/core.git
cgutech-golang
core
core
v1.0.5

搜索帮助