golang 执行命令行

golang 执行命令行,第1张

第一种

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

package main

import (
	"log"
	"os/exec"
)

/**
 * @author micro.cloud.fly
 * @date 2021/10/8 3:15 下午
 * @desc 直接调用 Cmd 对象的 Run 函数,返回的只有成功和失败,获取不到任何输出的结果。


 */
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"
)

/**
 * @author micro.cloud.fly
 * @date 2021/10/8 3:15 下午
 * @desc 有时候我们执行一个命令就是想要获取输出结果,此时你可以调用 Cmd 的 CombinedOutput 函数。



 */
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"

/**
 * @author micro.cloud.fly
 * @date 2021/10/15 4:34 下午
 * @desc
 */
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"
)

/**
 * @author micro.cloud.fly
 * @date 2021/10/8 3:22 下午
 * @desc 执行命令,并区分stdout 和 stderr
 */
func main() {
	//cmd := exec.Command("ls", "-lh", "/usr/local/logs/*.log")
	cmd := exec.Command("/bin/sh",  "-c"," go run /Users/java0904/goProject/demo-os-exec/demo07/main.go")
	var stdout, stderr bytes.Buffer
	cmd.Stdout = &stdout  // 标准输出
	cmd.Stderr = &stderr  // 标准错误
	err := cmd.Run()
	outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
	fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)
	if err != nil {
		log.Fatalf("cmd.Run() failed with %s\n", err)
	}
}

执行输出

out:
0
1
2
3
4
5
6
7
8
9

err:

第四种

有管道符的命令

package main

import (
	"os"
	"os/exec"
)

/**
 * @author micro.cloud.fly
 * @date 2021/10/8 3:25 下午
 * @desc 相当于执行了命令行(查看文件的行数):grep ERROR /var/log/messages | wc -l
 */
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


/**
 * @author micro.cloud.fly
 * @date 2021/10/8 3:29 下午
 * @desc
 */
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 %s\n", err)
	}
	fmt.Printf("%s", out)
}

执行输出:

cloud
第六种

进程之间的通信

package main

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

/**
 * @author micro.cloud.fly
 * @date 2021/10/15 4:44 下午
 * @desc
 */
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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存