go 执行shell命令

简单案例

package main

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

var (
	ctx = context.Background()
)

func main() {
	cmd := exec.CommandContext(ctx, "ip", "a")
	res, err := cmd.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}

注意:命令的第一个参数一定是一个可以在bash环境下直接运行的文件,否则,不会成功
例如:这里是把ip a拆开来运行的,而不是写在一起运行

带有管道符的命令

一条命令完成

这里需要借助 bash -c 命令

package main

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

var (
	ctx = context.Background()
)

func main() {
	cmd := exec.CommandContext(ctx, "bash", "-c", "ip a | grep host")
	res, err := cmd.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}

因为有特殊字符(管道符),所以,这里需要使用 bash -c 来运行

注意:最后一个参数最好是全部命令,除了 bash -c ,其他的不要分开写

补充知识点
当执行shell命令时,通常不需要在命令前面添加 bash -c
然而,有时候确实需要使用该语法。
这通常是因为命令中包含特殊字符或需要解释执行的脚本。
使用 bash -c 告诉系统将后续的命令作为一个字符串进行解释执行。
这对于一些复杂的命令或脚本来说是有用的。

举个例子,如果你想要执行一个包含特殊字符的命令或脚本,如管道、重定向、通配符等,那么使用 bash -c 可以确保命令被正确地解析和执行。
另外,如果你想在一个脚本中调用另一个脚本,你也可以使 用这个语法。

总的来说,大部分情况下不需要使用 bash -c ,但在处理特殊字符或复杂脚本时,它是一个很有用的工具。

组合执行

package main

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

var (
	ctx = context.Background()
)

func main() {
	cmd1 := exec.CommandContext(ctx, "bash", "-c", "ip a")

	// 获取标准输出和标准错误输出
	out1, err := cmd1.Output()
	if err != nil {
		panic(err)
	}

	// 构建第二部分命令
	cmd2 := exec.CommandContext(ctx, "grep", " host")
	// 将第一部分的输出转换成bytes.Reader类型,然后传递给第二部分命令的输出
	cmd2.Stdin = bytes.NewReader(out1)
	res, err := cmd2.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}
posted @ 2023-08-07 11:22  厚礼蝎  阅读(216)  评论(0编辑  收藏  举报