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))
}
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17610969.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!