Go语言入门exec的基本使用示例_第1页
Go语言入门exec的基本使用示例_第2页
Go语言入门exec的基本使用示例_第3页
Go语言入门exec的基本使用示例_第4页
Go语言入门exec的基本使用示例_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Go语言入门exec的基本使用示例目录使用GoLangexec包运行命令为不同的操作系统指定命令Goexec命令捕获输出Gocmd.StdinPipeGocmd.StdoutPipe总结Exec是os包中的一个子包,它可用于使用Go运行外部命令。Goexec命令教程展示了如何在Golang中执行shell命令和程序。

要使用这个包,我们需要按如下方式导入:

import"os/exec"

使用GoLangexec包运行命令

我们可以运行任何我们希望的命令。就像我们使用CMD、bash或其他一些shell来运行命令一样,它可以运行这些命令。

这是运行ls命令的示例。新建一个main.go:

packagemain

import(

"fmt"

"os/exec"

funcmain(){

cmd:=exec.Command("ls")

e:=cmd.Run()

CheckError(e)

funcCheckError(eerror){

ife!=nil{

fmt.Println(e)

}

Run函数启动指定命令并等待它完成,而Start启动指定命令但不等待它完成;我们需要使用WaitwithStart。

然后新建一个go.mod文件:

$gomodinitmain.go

go:creatingnewgo.mod:modulemain.go

go:toaddmodulerequirementsandsums:

gomodtidy

现在,程序将运行,但我们不会看到控制台的任何输出。原因是命令运行,输出没有发送到标准输出。

$gorunmain.go

所以,我们需要修复它。添加下面显示的两行以查看控制台的任何输出。

cmd.Stdout=os.Stdout

cmd.Stderr=os.Stderr

输出将显示当前目录中的文件。

packagemain

import(

"fmt"

"os"

"os/exec"

funcmain(){

cmd:=exec.Command("ls","-lah")

cmd.Stdout=os.Stdout

cmd.Stderr=os.Stderr

e:=cmd.Run()

CheckError(e)

funcCheckError(eerror){

ife!=nil{

fmt.Println(e)

然后我们再程序,可以看到标准台输出如下的文件:

$gorunmain.go

total16

drwxr-xr-x4yuzhou_1sustaff128B51522:56.

drwxr-xr-x23yuzhou_1sustaff736B51522:53..

-rw-r--r--1yuzhou_1sustaff24B51522:56go.mod

-rw-r--r--1yuzhou_1sustaff248B51523:18main.go

利用直接ls直接运行该命令,可以看到结果正确:

$ls-alh

total16

drwxr-xr-x4yuzhou_1sustaff128B51522:56.

drwxr-xr-x23yuzhou_1sustaff736B51522:53..

-rw-r--r--1yuzhou_1sustaff24B51522:56go.mod

-rw-r--r--1yuzhou_1sustaff248B51523:18main.go

为不同的操作系统指定命令

我们可以指定针对不同操作系统运行不同的命令(例如Linux上的bash命令)。这是一个例子。

ifruntime.GOOS=="linux"{

cmd=exec.Command("ls")

为此,我们还需要导入运行时包。

要查看所有可能的操作系统,我们可以运行gotooldistlist,它将显示所有可能的操作系统和ARCH组合。

Goexec命令捕获输出

输出运行命令并返回其标准输出:

packagemain

import(

"fmt"

"log"

"os/exec"

funcmain(){

out,err:=exec.Command("ls","-l").Output()

iferr!=nil{

log.Fatal(err)

fmt.Println(string(out))

运行该程序:

$gorunmain.go

total16

-rw-r--r--1yuzhou_1sustaff2451522:56go.mod

-rw-r--r--1yuzhou_1sustaff18051523:33main.go

Gocmd.StdinPipe

管道允许我们将一个命令的输出发送到另一个命令。StdinPipe返回一个管道,该管道将在命令启动时连接到命令的标准输入。

packagemain

import(

"fmt"

"io"

"log"

"os/exec"

funcmain(){

cmd:=exec.Command("cat")

stdin,err:=cmd.StdinPipe()

iferr!=nil{

log.Fatal(err)

gofunc(){

deferstdin.Close()

io.WriteString(stdin,"anoldfalcon")

out,err:=cmd.CombinedOutput()

iferr!=nil{

log.Fatal(err)

fmt.Printf("%s\n",out)

}

在代码示例中,我们将字符串写入goroutine内的标准输入。

cmd:=exec.Command("cat")

cat命令将给定的文件连接到标准输出。当没有给定文件或带有-时,该命令读取标准输入并将其打印到标准输出。

stdin,err:=cmd.StdinPipe()

我们得到cat命令的标准输入管道。

gofunc(){

deferstdin.Close()

io.WriteString(stdin,"anoldfalcon")

}()

在goroutine内部,我们将一个字符串写入标准输入管道。

$gorunstdinpipe.go

anoldfalcon

Gocmd.StdoutPipe

StdoutPipe返回一个管道,该管道将在命令启动时连接到命令的标准输出。

packagemain

import(

"fmt"

"io/ioutil"

"log"

"os/exec"

"strings"

funcupper(datastring)string{

returnstrings.ToUpper(data)

funcmain(){

cmd:=exec.Command("echo","anoldfalcon")

stdout,err:=cmd.StdoutPipe()

iferr!=nil{

log.Fatal(err)

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

log.Fatal(err)

data,err:=ioutil.ReadAll(stdout)

iferr!=nil{

log.Fatal(err)

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

log.Fatal(err)

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

该示例通过管道读取echo命令的输出并将其转换为大写字母。

cmd:=exec.Command("echo","anoldfalcon")

要运行的命令是带有单个字符串参数的echo命令。

stdout,err:=cmd.StdoutPipe()

我们得到标准输出管道。

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

log.Fatal(err)

}

该命令使用Start函数执行;它不会等待它完成。

data,err:=ioutil.ReadAll(stdout)

我们从管道中读取数据。

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

log.Fatal(err)

}

Wait等待命令退出并等待任何复制到stdin或从stdout或stderr复制完成。它在看到命令退出后关闭管道。

运行该程序:

$go

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论