广告
返回顶部
首页 > 资讯 > 操作系统 >怎么使用golang执行Linux shell命令
  • 530
分享到

怎么使用golang执行Linux shell命令

2023-07-02 14:07:48 530人浏览 泡泡鱼
摘要

这篇文章主要讲解了“怎么使用golang执行linux shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Golang执行Linux shell命令”吧

这篇文章主要讲解了“怎么使用golang执行linux shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Golang执行Linux shell命令”吧!

1. 执行命令并获得输出结果

CombinedOutput()

执行程序返回 standard output and standard error

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

Output()

执行程序返回standard output

func main() {    out, err := exec.Command("date").Output()    if err != nil {        log.Fatal(err)    }    fmt.Printf("The date is %s\n", out)}

2. 将stdout和stderr分别处理

用buffer接受输出

func main() {    cmd := exec.Command("ls", "-lah")    var stdin, stdout, stderr bytes.Buffer    cmd.Stdin = &stdin    cmd.Stdout = &stdout    cmd.Stderr = &stderr    err := cmd.Run()    if err != nil {        log.Fatalf("cmd.Run() failed with %s\n", err)    }    outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())    fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)}

直接打印到屏幕

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

3. 异步执行命令

cmd.Run() 阻塞等待命令执行结束
cmd.Start() 不会等待命令完成

package mainimport (    "bytes"    "fmt"    "io"    "log"    "os"    "os/exec")func main() {    var stdoutBuf, stderrBuf bytes.Buffer    cmd := exec.Command("bash", "-c", "for i in 1 2 3 4;do echo $i;sleep 2;done")    stdoutIn, _ := cmd.StdoutPipe()    stderrIn, _ := cmd.StderrPipe()    var errStdout, errStderr error    stdout := io.MultiWriter(os.Stdout, &stdoutBuf)    stderr := io.MultiWriter(os.Stderr, &stderrBuf)    err := cmd.Start()    if err != nil {        log.Fatalf("cmd.Start() failed with '%s'\n", err)    }    go func() {        _, errStdout = io.Copy(stdout, stdoutIn)    }()    go func() {        _, errStderr = io.Copy(stderr, stderrIn)    }()    err = cmd.Wait()    if err != nil {        log.Fatalf("cmd.Run() failed with %s\n", err)    }    if errStdout != nil || errStderr != nil {        log.Fatal("failed to capture stdout or stderr\n")    }    outStr, errStr := string(stdoutBuf.Bytes()), string(stderrBuf.Bytes())    fmt.Printf("\nout:\n%s\nerr:\n%s\n", outStr, errStr)}

4. 执行时带上环境变量

func main() {    cmd := exec.Command("bash", "-c", "programToExecute")    additionalEnv := "programToExecute=ls"    newEnv := append(os.Environ(), additionalEnv)    cmd.Env = newEnv    out, err := cmd.CombinedOutput()    if err != nil {        log.Fatalf("cmd.Run() failed with %s\n", err)    }    fmt.Printf("%s", out)}

5. 预先检查命令是否存在

func checkLsExists() {    path, err := exec.LookPath("ls")    if err != nil {        fmt.Printf("didn't find 'ls' executable\n")    } else {        fmt.Printf("'ls' executable is in '%s'\n", path)    }}

6. 两个命令依次执行,管道通信

func main() {    c1 := exec.Command("ls")    c2 := exec.Command("wc", "-l")    r, w := io.Pipe()     c1.Stdout = w    c2.Stdin = r    var b2 bytes.Buffer    c2.Stdout = &b2    c1.Start()    c2.Start()    c1.Wait()    w.Close()    c2.Wait()    io.Copy(os.Stdout, &b2)}

或者

func main() {    c1 := exec.Command("ls")    c2 := exec.Command("wc", "-l")    c2.Stdin, _ = c1.StdoutPipe()    c2.Stdout = os.Stdout    _ = c2.Start()    _ = c1.Run()    _ = c2.Wait()}

反正下面这样是不行的

func main() {    c := exec.Command("ls", "|", "wc", "-l")    c.Stdout = os.Stdout    _ = c.Run()}

不嫌丑可以用bash -c

func main() {    cmd := "cat /proc/cpuinfo | egrep '^model name' | uniq | awk '{print substr($0, index($0,$4))}'"    out, err := exec.Command("bash", "-c", cmd).Output()    if err != nil {        fmt.Printf("Failed to execute command: %s", cmd)    }    fmt.Println(string(out))}

7. 按行读取输出内容

func main() {    cmd := exec.Command("ls", "-la")    stdout, _ := cmd.StdoutPipe()    cmd.Start()    reader := bufio.NewReader(stdout)    for {        line, err := reader.ReadString('\n')        line = strings.TrimSpace(line)        if err != nil || io.EOF == err {            break        }        log.Println(line)    }    cmd.Wait()}

8. 获得exit code

func RunCommand(name string, args ...string) (stdout string, stderr string, exitCode int) {    log.Println("run command:", name, args)    var outbuf, errbuf bytes.Buffer    cmd := exec.Command(name, args...)    cmd.Stdout = &outbuf    cmd.Stderr = &errbuf    err := cmd.Run()    stdout = outbuf.String()    stderr = errbuf.String()    if err != nil {        // try to get the exit code        if exitError, ok := err.(*exec.ExitError); ok {            ws := exitError.Sys().(syscall.WaitStatus)            exitCode = ws.ExitStatus()        } else {            // This will happen (in OSX) if `name` is not available in $PATH,            // in this situation, exit code could not be get, and stderr will be            // empty string very likely, so we use the default fail code, and fORMat err            // to string and set to stderr            log.Printf("Could not get exit code for failed program: %v, %v", name, args)            exitCode = defaultFailedCode            if stderr == "" {                stderr = err.Error()            }        }    } else {        // success, exitCode should be 0 if go is ok        ws := cmd.ProcessState.Sys().(syscall.WaitStatus)        exitCode = ws.ExitStatus()    }    log.Printf("command result, stdout: %v, stderr: %v, exitCode: %v", stdout, stderr, exitCode)    return}

感谢各位的阅读,以上就是“怎么使用golang执行Linux shell命令”的内容了,经过本文的学习后,相信大家对怎么使用golang执行Linux shell命令这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么使用golang执行Linux shell命令

本文链接: https://www.lsjlt.com/news/342366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用golang执行Linux shell命令
    这篇文章主要讲解了“怎么使用golang执行Linux shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用golang执行Linux shell命令”吧...
    99+
    2023-07-02
  • Golang怎么应用执行Shell命令
    今天小编给大家分享一下Golang怎么应用执行Shell命令的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。exec包使用官方...
    99+
    2023-07-05
  • Golang应用执行Shell命令实战
    目录exec包运行基本Shell命令执行长时间运行命令自定义写输出使用Stdin给命令传递输入结束子进程总结本文学习如何在Golang程序中执行Shell命令(如,ls,mkdir或...
    99+
    2023-03-19
    Golang执行Shell命令 Golang执行Shell
  • Linux命令行循环执行shell命令
    目录linux命令行,循环执行shell命令死循环命令格式效果普通计数循环循环10次效果LLinux命令行,循环执行shell命令 死循环 命令格式 while true ;do <command>; don...
    99+
    2023-01-03
    linuxshell循环执行命令 循环执行shell命令 linux命令行 Linuxshell循环命令 while死循环
  • python怎么执行shell命令
    在Python中可以使用`os`模块中的`system`函数来执行Shell命令。以下是一个示例:```pythonimport o...
    99+
    2023-09-27
    python shell
  • linux下如何执行shell命令
    这篇文章将为大家详细讲解有关linux下如何执行shell命令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux下执行shell命令有两种方法 在当前shell中执行shell命令在当前s...
    99+
    2023-06-09
  • 怎么用命令执行Shell脚本
    本篇内容主要讲解“怎么用命令执行Shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用命令执行Shell脚本”吧!假设这个 shell 脚本的名称为 tinyshell.sh。在 L...
    99+
    2023-06-09
  • 详解golang执行Linux shell命令完整场景下的使用方法
    目录1. 执行命令并获得输出结果2. 将stdout和stderr分别处理3. 异步执行命令4. 执行时带上环境变量5. 预先检查命令是否存在6. 两个命令依次执行,管道通信7. 按行读取输出内容8. 获得exit co...
    99+
    2022-06-30
    golang执行Linuxshell golang执行shell命令
  • JSch怎么远程执行Shell命令
    这篇文章主要介绍了JSch怎么远程执行Shell命令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释...
    99+
    2023-06-14
  • shell命令怎么在docker中执行
    这篇文章将为大家详细讲解有关shell命令怎么在docker中执行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在docker中执行shell命令,需要在命令前增加sh -c,例如:dock...
    99+
    2023-06-14
  • node怎么执行cmd或shell命令
    这篇文章主要介绍“node怎么执行cmd或shell命令”,在日常操作中,相信很多人在node怎么执行cmd或shell命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node怎么执行cmd或shell命令...
    99+
    2023-07-02
  • java怎么执行linux命令
    在Java中执行Linux命令有以下几种方法:1. 使用Runtime类的exec()方法:这是最简单的方法,它可以直接执行一个命令...
    99+
    2023-09-17
    java linux
  • linux下执行shell命令方法简介
    linux下执行shell命令有两种方法 在当前shell中执行shell命令 在当前shell中产生一个subshell,在subshell中执行shell命令 1.在当前shell中执行...
    99+
    2022-06-04
    命令 简介 方法
  • 使用hbase-shell命令怎么批量执行脚本
    今天就跟大家聊聊有关使用hbase-shell命令怎么批量执行脚本,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。批量执行hbase shell 命令#!/bin/bash ...
    99+
    2023-06-09
  • 使用Spark-shell怎么批量命令执行脚本
    这篇文章给大家介绍使用Spark-shell怎么批量命令执行脚本,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。批量执行spark-shell命令,并指定提交参数#!/bin/bashsource /etc/p...
    99+
    2023-06-09
  • 使用hive-shell命令怎么批量执行脚本
    使用hive-shell命令怎么批量执行脚本?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如下所示:#!/usr/bin/bashHADOOP_HOME=&qu...
    99+
    2023-06-09
  • Java JSch怎么远程执行Shell命令
    这篇文章主要讲解了“Java JSch怎么远程执行Shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java JSch怎么远程执行Shell命令”吧!JSch ...
    99+
    2023-06-29
  • Python2.x利用commands模块执行Linux shell命令
    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数:...
    99+
    2022-06-04
    模块 命令 commands
  • 怎么并发执行Linux命令
    这篇文章主要讲解了“怎么并发执行Linux命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么并发执行Linux命令”吧!串行是按照顺序一条接着一条的执行命令,与串行相对的是多条命令同时执...
    99+
    2023-06-15
  • 怎么使用pv命令监控Linux命令的执行进度
    小编给大家分享一下怎么使用pv命令监控Linux命令的执行进度,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PV 命令PV 由Andrew Wood 开发,是 P...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作