我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang怎么应用执行Shell命令

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang怎么应用执行Shell命令

今天小编给大家分享一下Golang怎么应用执行Shell命令的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

exec包

使用官方os/exec包可以执行外部命令,当你执行shell命令,是需要在Go应用的外部运行代码,因此需要这些命令在子进程中运行。如下图所示:

Golang怎么应用执行Shell命令

每个命令在Go应用中作为子进程运行,并暴露stdin和stdout属性,我们可以使用它们读写进程数据。

运行基本Shell命令

运行简单命令并从它的输出中读取数据,通过创建*exec.Cmd实例实现。在下面示例中,使用ls列出当前目录下的文件,并从代码中打印其输出:

// create a new *Cmd instance// here we pass the command as the first argument and the arguments to pass to the command as the// remaining arguments in the functioncmd := exec.Command("ls", "./")// The `Output` method executes the command and// collects the output, returning its valueout, err := cmd.Output()if err != nil {  // if there was any error, print it here  fmt.Println("could not run command: ", err)}// otherwise, print the output from running the commandfmt.Println("Output: ", string(out))

因为在当前目录下运行程序,因此输出项目根目录下文件:

> go run shellcommands/main.goOutput:  LICENSEREADME.mdcommand.go

Golang怎么应用执行Shell命令

当运行exec,程序没有产生shell,而是直接运行给定命令,这意味着不会进行任何基于shell的处理,比如glob模式或扩展。举例,当运行ls ./*.md命令,并不会如我们在那个shell中运行命令一样输出readme.md

执行长时间运行命令

前面示例执行ls命令立刻返回结果,但当命令输出是连续的、或需要很长时间执行时会怎样呢?举例,运行ping命令,会周期性获得连续结果:

ping www.baidu.com PING www.a.shifen.com (36.152.44.95) 56(84) bytes of data.64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=1 ttl=128 time=11.1 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2 ttl=128 time=58.8 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3 ttl=128 time=28.2 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=4 ttl=128 time=11.1 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=5 ttl=128 time=11.5 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=6 ttl=128 time=53.6 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=7 ttl=128 time=10.2 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=8 ttl=128 time=10.4 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=9 ttl=128 time=15.8 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=10 ttl=128 time=16.5 ms64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=11 ttl=128 time=10.9 ms^C64 bytes from 36.152.44.95: icmp_seq=12 ttl=128 time=9.92 ms

如果尝试使用cmd.Output执行这类命令,则不会获得任何结果,因为Output方法等待命令执行结束,而ping无限期执行。因此需要自定义Stdout属性去读取连续输出:

cmd := exec.Command("ping", "google.com")// pipe the commands output to the applications// standard outputcmd.Stdout = os.Stdout// Run still runs the command and waits for completion// but the output is instantly piped to Stdoutif err := cmd.Run(); err != nil {  fmt.Println("could not run command: ", err)}

再次运行程序,输出结果于Shell中执行类似。

通过直接分配Stdout属性,我们可以在整个命令生命周期中捕获输出,并在接收到输出后立即对其进行处理。进程间io交互如下图所示:

Golang怎么应用执行Shell命令

自定义写输出

代替使用os.Stdout,还能通过实现io.Writer接口创建自定义写输出。

下面自定义代码在每个输出块前增加"received output: "前缀:

type customOutput struct{}func (c customOutput) Write(p []byte) (int, error) {fmt.Println("received output: ", string(p))return len(p), nil}

现在给命令输出赋值自定义写输出实例:

cmd.Stdout = customOutput{}

再次运行程序,会获得下面的输出。

使用Stdin给命令传递输入

前面示例没有给命令任何输入(或提供有限输入作为参数),大多数场景中通过Stdin流传递输入信息。典型的示例为grep命令,可以通过管道从一个命令串给另一个命令:

➜  ~ echo "1. pear\n2. grapes\n3. apple\n4. banana\n" | grep apple3. apple

这里echo的输出作为stdin传给grep,输入一组水果,通过grep过滤仅输出apple.

*Cmd实例提供了输入流用于写入,下面实例使用它传递输入给grep子进程:

cmd := exec.Command("grep", "apple")// Create a new pipe, which gives us a reader/writer pairreader, writer := io.Pipe()// assign the reader to Stdin for the commandcmd.Stdin = reader// the output is printed to the consolecmd.Stdout = os.Stdoutgo func() {  defer writer.Close()  // the writer is connected to the reader via the pipe  // so all data written here is passed on to the commands  // standard input  writer.Write([]byte("1. pear\n"))  writer.Write([]byte("2. grapes\n"))  writer.Write([]byte("3. apple\n"))  writer.Write([]byte("4. banana\n"))}()if err := cmd.Run(); err != nil {  fmt.Println("could not run command: ", err)}

输出结果:

apple

Golang怎么应用执行Shell命令

结束子进程

有一些命令无限期运行,需要能够显示信号去结束。举例,如果使用python3 -m http.server运行web服务或sleep 10000,则子进程会运行很长时间或无限期运行。

要停止进程,需要从应用中发送kill信号,可以通过给命令增加上下文实例实现。如果上下文取消,则命令也会终止执行:

ctx := context.Background()// The context now times out after 1 second// alternately, we can call `cancel()` to terminate immediatelyctx, _ = context.WithTimeout(ctx, 1*time.Second)// sleep 10 second cmd := exec.CommandContext(ctx, "sleep", "10")out, err := cmd.Output()if err != nil {  fmt.Println("could not run command: ", err)}fmt.Println("Output: ", string(out))

运行程序,1秒后输出结果:

could not run command:  signal: killed
Output:  

当需要在有限时间内运行命令或在一定时间内命令没有返回结果则执行备用逻辑。

以上就是“Golang怎么应用执行Shell命令”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang怎么应用执行Shell命令

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

下载Word文档

猜你喜欢

Golang怎么应用执行Shell命令

今天小编给大家分享一下Golang怎么应用执行Shell命令的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。exec包使用官方
2023-07-05

Golang应用执行Shell命令实战

本文主要介绍了Golang应用执行Shell命令实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

怎么使用golang执行Linux shell命令

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

python怎么执行shell命令

在Python中可以使用`os`模块中的`system`函数来执行Shell命令。以下是一个示例:```pythonimport os# 执行ls命令os.system('ls')# 执行pwd命令,并获取输出结果result = os.p
2023-09-27

怎么用命令执行Shell脚本

本篇内容主要讲解“怎么用命令执行Shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用命令执行Shell脚本”吧!假设这个 shell 脚本的名称为 tinyshell.sh。在 L
2023-06-09

JSch怎么远程执行Shell命令

这篇文章主要介绍了JSch怎么远程执行Shell命令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释
2023-06-14

node怎么执行cmd或shell命令

这篇文章主要介绍“node怎么执行cmd或shell命令”,在日常操作中,相信很多人在node怎么执行cmd或shell命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node怎么执行cmd或shell命令
2023-07-02

shell命令怎么在docker中执行

这篇文章将为大家详细讲解有关shell命令怎么在docker中执行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在docker中执行shell命令,需要在命令前增加sh -c,例如:dock
2023-06-14

Java JSch怎么远程执行Shell命令

这篇文章主要讲解了“Java JSch怎么远程执行Shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java JSch怎么远程执行Shell命令”吧!JSch 简介JSch 是Ja
2023-06-29

Java.Utils怎么执行命令行命令

小编给大家分享一下Java.Utils怎么执行命令行命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Spring
2023-06-14

使用hbase-shell命令怎么批量执行脚本

今天就跟大家聊聊有关使用hbase-shell命令怎么批量执行脚本,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。批量执行hbase shell 命令#!/bin/bash sourc
2023-06-09

使用Spark-shell怎么批量命令执行脚本

这篇文章给大家介绍使用Spark-shell怎么批量命令执行脚本,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。批量执行spark-shell命令,并指定提交参数#!/bin/bashsource /etc/profil
2023-06-09

使用hive-shell命令怎么批量执行脚本

使用hive-shell命令怎么批量执行脚本?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如下所示:#!/usr/bin/bashHADOOP_HOME="/o
2023-06-09

shell中使用expect命令进行远程执行命令脚本

expect是用来实现自动交互功能的工具之一,使用expect-send来实现交互过程。 注意: 1、脚本的执行方法与bash shell不一样,比如:expect example.sh 2、向一个
2022-06-04

shell怎么判断命令是否执行成功

在shell中,可以使用特殊变量$?来获得上一个命令的退出状态码。一般情况下,退出状态码为0表示命令执行成功,非0表示命令执行失败。例如,可以使用以下方式来判断命令是否执行成功:```shellcommandif [ $? -eq 0 ];
2023-08-12

java怎么执行shell命令并返回结果

在Java中,可以使用`ProcessBuilder`类来执行shell命令并返回结果。下面是一个例子:```javaimport java.io.BufferedReader;import java.io.IOException;impo
2023-09-15

Shell脚本中怎么切换用户并执行命令

这期内容当中小编将会给大家带来有关Shell脚本中怎么切换用户并执行命令,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。系统:centos 5.x脚本内容:cat test.sh代码如下:#!/bin/ba
2023-06-09

如何用shell脚本执行hadoop命令

要使用shell脚本执行Hadoop命令,可以按照以下步骤操作:1. 创建一个新的文本文件,并使用任何文本编辑器打开它(如vi、nano等)。2. 在文件的第一行添加以下内容,以告知操作系统要使用哪个解释器来执行该脚本:```bash#!/
2023-10-11

navicat怎么执行命令

在 navicat 中执行命令可以通过“sql 编辑器”选项卡,输入 sql 查询或管理数据库命令,再单击“执行”按钮。常用的命令包括创建表、插入数据、查询数据、更新数据和删除数据。如何在 Navicat 中执行命令在 Navicat 中
navicat怎么执行命令
2024-04-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录