热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxgo命令,Golang调用Linux命令

Golang中可以使用osexec来执行Linux命令,下面是一个简单的示例:packagemainimport(fmtioioutilose

Golang 中可以使用 os/exec 来执行 Linux 命令,下面是一个简单的示例:

package main

import (

"fmt"

"io/ioutil"

"os/exec"

)

func main() {

cmd := exec.Command("/bin/bash", "-c", `df -lh`)

//创建获取命令输出管道

stdout, err := cmd.StdoutPipe()

if err != nil {

fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)

return

}

//执行命令

if err := cmd.Start(); err != nil {

fmt.Println("Error:The command is err,", err)

return

}

//读取所有输出

bytes, err := ioutil.ReadAll(stdout)

if err != nil {

fmt.Println("ReadAll Stdout:", err.Error())

return

}

if err := cmd.Wait(); err != nil {

fmt.Println("wait:", err.Error())

return

}

fmt.Printf("stdout:\n\n %s", bytes)

}

或者创建一个缓冲读取器按行读取:

package main

import (

"bufio"

"fmt"

"os/exec"

)

func main() {

cmd := exec.Command("/bin/bash", "-c", `df -lh`)

//创建获取命令输出管道

stdout, err := cmd.StdoutPipe()

if err != nil {

fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)

return

}

//执行命令

if err := cmd.Start(); err != nil {

fmt.Println("Error:The command is err,", err)

return

}

//使用带缓冲的读取器

outputBuf := bufio.NewReader(stdout)

for {

//一次获取一行,_ 获取当前行是否被读完

output, _, err := outputBuf.ReadLine()

if err != nil {

// 判断是否到文件的结尾了否则出错

if err.Error() != "EOF" {

fmt.Printf("Error :%s\n", err)

}

return

}

fmt.Printf("%s\n", string(output))

}

//wait 方法会一直阻塞到其所属的命令完全运行结束为止

if err := cmd.Wait(); err != nil {

fmt.Println("wait:", err.Error())

return

}

}

输出结果:

30b7c2e7e2ed

在写这句 if err.Error() != "EOF" 时,一直以为可以直接将 error 类型直接转为 string 然后就可以比较了,所以刚开始写的代码是这样的 if string(err) != "EOF",但是一直报下面这个错误:

# command-line-arguments

./exec_command.go:36: cannot convert err (type error) to type string

于是查了下才明白,error 类型本身是一个预定义好的接口,里面定义了一个method:

type error interface {

Error() string

}

所以 err.Error() 才是一个 string 类型的返回值。



推荐阅读
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • Java 中重写与重载的区别
    本文详细解析了 Java 编程语言中重写(Override)和重载(Overload)的概念及其主要区别,帮助开发者更好地理解和应用这两种多态性机制。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
author-avatar
ld无痕的心迹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有