案例分享: Go语言如何调用外部命令


1. 前言

有时候我们需要在go程序中调用外部命令,本文通过精心设计的案例来演示如何使用exec包实现这一功能。

本文代码在Linux系统中运行正常,并未在windows系统中测试过(不一定适用于windows系统),你可以参考本文的示例代码创建对应的windows版本。

2. 示例1:调用vi 和 cat 命令

示例1的功能如下图所示:

1 读取文件名称
2 调用vi命令编辑文件内容
3 调用cat命令显示文件内容

2.1 代码

package main

import (
	"log"
	"os"
	"os/exec"

	"fmt"
)

func main() {
	// 1 Read filename from stdin
	var file string
	fmt.Print("Enter filename: ")
	_, err := fmt.Scanln(&file)
	if err != nil {
		log.Fatalf("failed to read filename: %v", err)
	}

	// 2 Create/edit the file using vi editor
	fmt.Printf("> vi %s\n", file)
	cmd := exec.Command("vi", file)
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err = cmd.Run()
	if err != nil {
		log.Fatalf("vi %q: %v", file, err)
	}

	// 3 Print the content of the file using cat command
	fmt.Printf("> cat %s\n", file)
	cmd = exec.Command("cat", file)
	out, err := cmd.Output()
	if err != nil {
		log.Fatalf("cat %q: %v", file, err)
	}
	fmt.Println(string(out))
}

代码说明

  • 1 使用fmt.Scanln函数,从标准输入设备读取文件名, 如 demo.txt.
  • 2 调用外部命令vi编辑 demo.txt。 这一步首先使用 exec.Command("vi", file) 得到一个*Cmd , 然后绑定其 Stdin/Stdout/Stderr至 os.Stdin/os.Stdout/os.Stderr,最后调用cmd.Run()执行外部命令vi.
  • 3 调用外部命令 cat 显示 demo.txt 文件的内容. 这一步中的cmd.Output() 用于捕捉外部命令的标准输出.

2.2 示例1演示

示例1演示

3. 示例2: 调用python解释器求值算术表达式

本示例要求电脑上已经安装 Python3

示例2的功能如下图所示:

1 读取算数表达式
2 拼接python脚本
3 执行python脚本求值

3.1 代码

package main

import (
	"log"
	"os/exec"

	"fmt"
)

func main() {
	// 1 Read filename from stdin
	var expr string
	fmt.Print("Enter an arithmetic expression: ")
	_, err := fmt.Scanln(&expr)
	if err != nil {
		log.Fatalf("failed to read an expression: %v", err)
	}

	// 2 Create an executable python script
	script := fmt.Sprintf("print(eval('%s'))", expr)

	// 3 Evaluate the expression by invoking a python command
	cmd := exec.Command("python3", "-c", script)
	out, err := cmd.Output()
	if err != nil {
		log.Fatalf("failed to evaluate expression: %v", err)
	}
	fmt.Printf("%s = %s", expr, string(out))
}

示例2的代码与示例1有诸多相似之处,在此不再赘述。

3.2 示例2演示

示例2演示

4. 结束语

本文通过两个实用示例并配以图文,介绍了go语言中如何调用外部命令。
关于exec包的详细说明,请参阅其官方文档.

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CODE CAMPING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值