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))
}