简单案例
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
不要分开写
组合执行
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))
}
标签:shell,err,exec,res,fmt,ctx,命令,go,main
From: https://www.cnblogs.com/guangdelw/p/17610969.html