golang os/exec 执行终端命令

2023-11-03

1. 只执行命令,不获取结果

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

package main

import (
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("ls", "-l", "/root")
    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
}

2. 执行命令,并获取结果

  Cmd 的 CombinedOutput 函数执行终端命令并返回执行结果
package main

import (
"log"
"os/exec"
)

func main() {
    cmd := exec.Command("ls", "-l", "/root")
    out, err := cmd.CombinedOutput()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
    log.Printf("combined out:\n%s\n", string(out))
}

CombinedOutput 函数,只返回 out,并不区分 stdout 和 stderr

3. 执行命令,并区分stdout 和 stderr

package main

import (
  "bytes"
  "log"
  "os/exec"
)

func main() {
  cmd := exec.Command("/bin/bash", "-c", "nginx -t")
  var stdout, stderr bytes.Buffer
  cmd.Stdout = &stdout // 标准输出
  cmd.Stderr = &stderr // 标准错误
  err := cmd.Run()
  if len(stderr.Bytes()) > 0 {
    log.Printf("stderr:%s\n", string(stderr.Bytes()))
  }
  if len(stdout.Bytes()) > 0 {
    log.Printf("stdout:%s\n", string(stdout.Bytes()))
  }

  if err != nil {
    log.Fatalf("cmd.Run() failed with %s\n", err)
  }
}

4. 多条命令组合,可以使用管道

在终端中经常使用管道

$ grep ERROR /var/log/messages | wc -l
19

在 Golang 中也有类似的实现

package main
import (
    "os"
    "os/exec"
)
func main() {
    c1 := exec.Command("grep", "ERROR", "/var/log/messages")
    c2 := exec.Command("wc", "-l")
    c2.Stdin, _ = c1.StdoutPipe()
    c2.Stdout = os.Stdout
    _ = c2.Start()
    _ = c1.Run()
    _ = c2.Wait()
}

5. 设置命令级别的环境变量

使用 os 库的 Setenv 函数来设置的环境变量,是作用于整个进程的生命周期

package main
import (
    "fmt"
    "log"
    "os"
    "os/exec"
)
func main() {
    os.Setenv("NAME", "wangbm")
    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)
}

感谢:https://zhuanlan.zhihu.com/p/296409942

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang os/exec 执行终端命令 的相关文章

  • It's Not Just Standing Up: Patterns of Daily Stand-up Meetings

    It s Not Just Standing Up Patterns of Daily Stand up Meetings Jason Yip ThoughtWorks Inc jcyip thoughtworks com http mar
  • VScode launch.json和tasks.json文件的配置

    task json version 2 0 0 command g args g file o file exe 编译命令参数 problemMatcher owner cpp fileLocation relative workspace
  • 高效的学习方法(费曼学习方法)

    学习技巧有四个简单的步骤 1 提取书本信息 阅读并理解 拿出一张白纸简要概括知识点以及对知识点进行深度拓展和横向拓展 深度拓展指增强知识点的理解深度 可以通过提问题的方式加强深度理解 横向拓展指增强其阅读广度 通过与其他学科建立关联 2 在
  • #pragma once和#ifndef / #define / #endif的区别

    转摘自 http www 360doc com content 10 0124 00 722458 14261695 shtml pragma once 指令格式如下 pragma once这是一个比较常用的指令 只要在头文件的最开始加入这
  • 华为OD机试 - 跳房子II(Java)

    题目描述 跳房子 也叫跳飞机 是一种世界性的儿童游戏 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 然后获得一次选房子的机会 直到所有房子被选完 房子最多的人获胜 跳房子的过程中 如果有踩线等违规行为 会结束当前回合 甚至可能
  • c++什么时候使用new,调用构造函数

    new 补充 构造函数的调用 对象 可以调用成员函数 不可以调用构造函数 我们无法像调用成员函数那样使用对象来调用构造函数 因为在构造函数构造出对象之前 对象是不存在的 因此构造函数被用来创建对象 而不能通过对象来调用 详见 构造函数的4种
  • 三台机器搭建redis集群过程及问题记录

    文章目录 1 前言 2 搭建集群 3 遇到的问题 4 相关文章 1 前言 Redis版本 5 0 4 服务器版本 Linux CentOS 6 CentOS 7 CentOS 9 redis集群需要至少要三个master节点 我们这里搭建三
  • prometheus 服务发现原理

    服务发现 概述 如上图 Prometheus核心功能包括服务发现 数据采集和数据存储 服务发现模块专门负责发现需要监控的目标采集点 target 信息 数据采集模块从服务发现模块订阅该信息 获取到target信息后 其中就包含协议 sche
  • selenium+python:Excel 存储数据,在已存在的Excel修改写入数据 并保存

    三 Excel文件的写入 思路 新建Excel表格 新增该表格的工作表 根据指定的行和列写入数据 保存Excel表格 参考链接 http www cnblogs com chjbbs p 4153239 html 具体代码如图 4 所示 4
  • MyBatis学习(四):MyBatis使用代理方法(接口)实现数据库的操作

    在第一篇简单的mybatis示例中 我们简单的介绍了如何通过SQL映射文件来实现对数据库的操作 在对数据库操作的时候是采用上图中的1 2来实现对数据库的操作 见上图就可以实现对数据库的操作了 但是这样做还是不太方便 有没有更好的方法呢 接口
  • 基于流计算 Oceanus(Flink) CDC 做好数据集成场景

    由于第一次做实时 所以踩坑比较多 见谅 测试环境用的flink 小公司没有用到hadoop组件 一 踩坑记录 1 本地代码的flink版本是flink1 15 4 生产环境是flink1 16 1 在使用侧输出流时报错 需要使用以下写法 需
  • Candy Machine--前缀和&&二分查找

    任意门 JB loves candy very much One day he finds a candy machine with N candies in it After reading the instructions of the
  • Web Components简单用法介绍

    目录 Web Components 使用方法 一 自定义元素 自定义元素的方法 1 自定义UserCard类 2 使用浏览器原生的 customElements define 方法 告诉浏览器 user card 元素与该类相连 3 在页面
  • 【C++】入门 --- 缺省参数&函数重载

    文章目录 一 缺省参数 1 基本概念 2 缺省参数的分类 全缺省参数 半缺省参数 缺省参数实用案例 二 函数重载 1 函数重载概念 1 参数类型不同 2 参数个数不同 3 参数类型顺序不同 三 C 支持函数重载的底层原理 函数名修饰 一 缺
  • 本地服务器与云服务器哪个好?

    本地服务器和云服务器是企业可以使用的两种不同的服务器设置 主要区别在于本地服务器托管 第三方提供商托管云服务器 那么 本地服务器和云服务器哪个更好呢 接下来 将带大家讨论本地服务器和云服务器的优缺点 并帮助您确定哪些设置适合我们的数据保护和
  • Vue中启动提示polyfill缺少-webpack v5版本导致

    安装 npm i node polyfill webpack plugin 因为我们的项目使用webpack v5 其中polyfill Node核心模块被删除 所以 我们安装它是为了在项目中访问这些模块 vue config js文件 c

随机推荐

  • 树莓派4b安装Ubuntu 18.04系统及图形桌面

    文章目录 1 准备工作 1 1 硬件 1 2 下载树莓派镜像 1 3 下载树莓派镜像工具 2 安装系统 2 1 SD卡格式化 2 2 安装系统 3 连接热点 4 启动树莓派 5 更改软件源 6 安装桌面 7 参考文献 8 树莓派开机后wif
  • 面向对象与面向过程

    文章目录 概述 半天的活动 将此思想用于指导开发编程 以下内容纯属个人理解 和胡说八道 如有雷同 绝对是抄袭 2023 05 01 22 14 概述 一种对理解面向对象毫无帮助的 对指导编程毫无意义的 绝对正确的废话是 面向对象就是万事万物
  • 计算机中数值的表示[原码,反码,补码]

    计算机里都是以补码的形式存储数据 电脑只能识别二进制的0和1 0 表示正 1表示负 一个数的最高位定义为符合号位 一个字节 8位 为例 原码 最高位符号位 0代表正数 1代表负数 非符号位为该数字绝对值的二进制 X 原 1 原 000000
  • CSRF漏洞的利用及修复

    文章目录 1 简介 2 攻击 2 1 GET型 2 1 1 寻找CSRF点 2 1 2 抓包 2 1 3 伪造 2 2 POST型 2 2 1 抓包 2 2 2 伪造 3 防范 1 简介 CSRF Cross Site Request Fo
  • HTTP简介,http是一个属于应用层的面向对象的协议

    引言 HTTP是一个属于应用层的面向对象的协议 由于其简捷 快速的方式 适用于分布式超媒体信息系统 它于1990年提出 经过几年的使用与发展 得到不断地完善和扩展 目前在WWW中使用的是HTTP 1 0的第六版 HTTP 1 1的规范化工作
  • 程序员的五种实用工具

    1 生成 RegEx RegexGPT 是编写 RegEx 模式的绝佳工具 它真的令人难以置信 试一试 你就知道了 它的工作原理是 给它一个示例文本 输入预期结果 你也可以稍微解释一下 这取决于你 然后选择要生成 RegEx 的语言 点击生
  • Vue3 PC端自适应

    安装依赖包 npm i lib flexible save npm install px2rem loader 引入 在main js中引入 import lib flexible flexible 修改flexible js文件 在项目下
  • C#学习之Dispose

    什么是资源 首先要提出 什么是资源 在CLR出来之后 Windows系统资源开始分为 非托管资源 和 托管资源 非托管资源是指 所有的Window内核对象 句柄 都是非托管资源 如对于Stream 数据库连接 GDI 的相关对象 还有Com
  • Ubuntu下安装goLand

    Ubuntu下安装GoLand 官网下载golang包 Other Versions GoLand 下载的是goland 2018 1 6 tar版本 更高的版本不容易激活 将程序解压至 usr local tar zxvf goland
  • 知识体系之APUE/内核编程

    目录 一 APUE 内核编程 1 基本概念与实现 1 1 进程3态 1 1 1 进程调度的方式 1 1 2 调度原则 1 1 3 调度算法 1 2 僵尸进程 孤儿进程 1 2 1 僵尸进程 1 2 2 孤儿进程 1 3 pread pwri
  • 前端-html-01

    1 前端开发 自学html css学习笔记 1 1 绝对路径 链接一张图的图片 img src 网页链接 本地连接 1 2 文本格式化 字体被 strong 加粗 strong 了 br 字体 em 倾斜 em br 我是
  • AI教程 如何在 Illustrator 中转换图稿?

    欢迎观看Illustrator教程 小编带大家学习 Illustrator 2022的基本工具和使用技巧 了解如何在 Illustrator 中应用旋转 反射和剪切转换图稿 在本文中我们将使用左侧的部件组装这枚火箭 并探索反射 剪切 旋转和
  • 使用python爬取豆瓣

    https www runoob com python python json html 我的理解就是告诉网站那边的人我是通过浏览器访问的 防止它分辨出我不是正常用户访问网站 这里要注意爬数据和调接口不是一回事 调接口我们是直接请求后端的数
  • [管理与领导-78]:IT基层管理者 - 核心技能 - 高效执行力 - 3 - 执行力的核心是拿到结果(ougput),而不是任务(input),也不是执行(过程、加工)

    前言 执行力的核心是结果 但并非所有人都理解 结果 对执行力的意义和作用 本文就是探讨对 结果 的理解 一 执行中常见的困惑 1 1 员工的困惑 接收任务 员工在执行工作过程中可能会遇到各种困惑 以下是一些可能的困惑情况 任务不清晰 员工可
  • 当 App 有了系统权限,真的可以为所欲为?

    看到群里发了两篇文章 出于好奇 想看看这些个 App 在利用系统漏洞获取系统权限之后 都干了什么事 于是就有了这篇文章 由于准备仓促 有些 Code 没有仔细看 感兴趣的同学可以自己去研究研究 多多讨论 深蓝洞察 2022 年度最 不可赦
  • GC 日志

    VM 参数 XX PrintGCDetails Xms30M Xmx30M Xmn10M 代码 import java lang management ManagementFactory import java lang managemen
  • log4j同步机制导致的cpu飙升排查与解决

    问题 组内某业务的几个相关接口均超时 上阿里云查日志一看是Dubbo调用超时 查看网络情况未发现异常 直接上Provider的机器查看占用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 to
  • 两段锁(2PL)理解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 两段锁即两阶段锁 Two phase locking 2PL 首先 两阶段锁强调的是 加锁 增长阶段 growing phase 和解锁 缩减阶段 shrinking ph
  • 正割、余割、正弦、余弦、正切、余切之间的关系的公式 sec、csc与sin、cos、tan、cot之间的各种公式...

    1 倒数关系 tan cot 1 sin csc 1 cos sec 1 2 商数关系 tan sin cos cot cos sin 3 平方关系 sin cos 1 1 tan sec 1 cot csc 4 求导关系 sec sect
  • golang os/exec 执行终端命令

    1 只执行命令 不获取结果 直接调用 Cmd 对象的 Run 函数 返回的只有成功和失败 获取不到任何输出的结果 package main import log os exec func main cmd exec Command ls l