栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang 执行命令行

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang 执行命令行

第一种

直接调用 Cmd 对象的 Run 函数,返回的只有成功和失败,获取不到任何输出的结果。

package main

import (
	"log"
	"os/exec"
)


func main() {
	command := exec.Command("ls", "-lh", "/usr/local/log")
	err := command.Run()
	if err != nil {
		log.Fatalf("cmd.run() failed with %s",err)
	}
}

执行会输出

2021/10/15 17:04:22 cmd.run() failed with exit status 1
第二种

有时候我们执行一个命令就是想要获取输出结果,此时你可以调用 Cmd 的 CombinedOutput 函数。

package main

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


func main() {
	//command := exec.Command("ls", "-lh", "/usr/local/logs/")
	command := exec.Command("/bin/sh",  "-c"," go run /Users/java0904/goProject/demo-os-exec/demo07/main.go")
	out,err := command.CombinedOutput()
	if err != nil {
		log.Fatalf("cmd.run() failed with %s",err)
	}
	fmt.Println(string(out))
}

其中,demo07/main.go的内容为:

package main

import "fmt"


func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

执行输出:

0
1
2
3
4
5
6
7
8
9
第三种

执行命令,并区分stdout标准输出 和 stderr标准错误输出

package main

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


func main() {
	//cmd := exec.Command("ls", "-lh", "/usr/local/logs
func main() {
	c1 := exec.Command("grep", "Email", "/usr/local/logs/producer.log")
	c2 := exec.Command("wc", "-l")
	c2.Stdin, _ = c1.StdoutPipe()
	c2.Stdout = os.Stdout
	_ = c2.Start()
	_ = c1.Run()
	_ = c2.Wait()
}

执行输出:

      60
第五种

设置环境变量

package main



import (
	"fmt"
	"log"
	"os"
	"os/exec"
)
func main() {
	os.Setenv("NAME", "cloud")
	cmd := exec.Command("echo", os.ExpandEnv("$NAME"))
	out, err := cmd.CombinedOutput()
	if err != nil {
		log.Fatalf("cmd.Run() failed with %sn", err)
	}
	fmt.Printf("%s", out)
}

执行输出:

cloud
第六种

进程之间的通信

package main

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


type Result struct {
	output string
	err error
}

func main() {

	results := make(chan Result, 100)
	ctc, cancelFunc := context.WithCancel(context.TODO())

	go func() {
		cmd := exec.CommandContext(ctc, "/bin/sh", "-c", "echo hello;sleep 2;echo world")
		output, err := cmd.CombinedOutput()
		result := Result{
			output: string(output),
			err:    err,
		}
		results<-result
	}()
	time.Sleep(time.Duration(1)*time.Second)
	cancelFunc()
	result:=<-results
	fmt.Println(result.output,result.err.Error())

}

执行输出

hello
 signal: killed
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/907261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号