当前位置:首页 > 技术文档 > 正文内容

golang执行系统命令os exec

admin5年前 (2020-03-24)技术文档1432

os/exec Command方法

func Command(name string, arg ...string) *Cmd

调用示例

exec.Command("ls", "-a", "-l")

运行系统命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main
 
import (
    "io/ioutil"
    "log"
    "os/exec"
)
 
func main() {
    // 执行系统命令
    // 第一个参数是命令名称
    // 后面参数可以有多个,命令参数
    cmd := exec.Command("ls""-a""-l")
    // 获取输出对象,可以从该对象中读取输出结果
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }
    // 保证关闭输出流
    defer stdout.Close()
    // 运行命令
    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }
    // 读取输出结果
    opBytes, err := ioutil.ReadAll(stdout)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(string(opBytes))
}

运行

$ go run exec.go 
2016/07/24 22:14:16 total 24
drwxr-xr-x  5 chenjiebin  staff  170 Jul 24 22:10 .
drwxr-xr-x  3 chenjiebin  staff  102 Jul 24 06:38 ..
......

输出重定向到文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
 
import (
    "log"
    "os"
    "os/exec"
)
 
func main() {
    cmd := exec.Command("ls""-a""-l")
    // 重定向标准输出到文件
    stdout, err := os.OpenFile("stdout.log", os.O_CREATE|os.O_WRONLY, 0600)
    if err != nil {
        log.Fatalln(err)
    }
    defer stdout.Close()
    cmd.Stdout = stdout
    // 执行命令
    if err := cmd.Start(); err != nil {
        log.Println(err)
    }
}

运行

$ go run redirect.go 
执行成功后会将输出内容写入stdout.log

标准错误输出和标准输入重定向的方式类似。

Start和Run的区别

Start执行不会等待命令完成就,Run会阻塞等待命令完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import (
    "log"
    "os/exec"
)
 
func main() {
    cmd := exec.Command("sleep""5")
    // 如果用Run,执行到该步则会阻塞等待5秒
    // err := cmd.Run()
    err := cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("Waiting for command to finish...")
    // Start,上面的内容会先输出,然后这里会阻塞等待5秒
    err = cmd.Wait()
    log.Printf("Command finished with error: %v", err)
}


分享到:

扫描二维码推送至手机访问。

版权声明:本文由云河空间发布,如需转载请注明出处。

本文链接:https://yuyunhe.cn/index.php/post/296.html

分享给朋友:

“golang执行系统命令os exec” 的相关文章

dz中“QQ互联”出现Discuz! Database Error解决办法

dz中“QQ互联”出现Discuz! Database Error解决办法

dz中QQ登陆出现Discuz! Database Error解决办法dz站长朋友相信肯定有人遇到做的QQ互联登录,根本没法用,这让网站的社交登录性能大打折扣,这么解决?下面就看大神的神操作!...

推荐一些国内的Jquery CDN免费服务

Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影。很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快。之前火端网络的一些网站都是使用Google的jquery CDN,如:http://ajax.googleapis.com/ajax/lib...

ThinkPHP实现多数据库连接的解决方法

这篇文章主要介绍了ThinkPHP实现多数据库连接的解决方法,需要的朋友可以参考下ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型:?123class MembersModel extends Model{protected $trueTableName =...

jQuery结合PHP+MySQL实现二级联动下拉列表[实例]

jQuery结合PHP+MySQL实现二级联动下拉列表[实例]

二级联动的实现方法还真不少,实用性也很强,这里结合一个学生信息表的实例,来分享一下我的实现过程实现原理:根据省份值的变动,通过jQuery把sf_id传给后台php文件处理,php通过查询MySQl数据库,得到对应的地市名,并返回JSON数据给前端处理,即实现联动效果!为便于讲解,这里直接给出省份:...

LNMP一键安装包安装以及常用的SSH命令使用整理

LNMP一键安装包安装以及常用的SSH命令使用整理

如果我们使用Linux VPS主机肯定会有接触到一键安装包,比如我们接触较多的就是LAMP、LNMP、LLSMP等。麦子翻看以前的文章毕竟分享的虚拟主机较多一些,VPS 主机类的教程相对少很多(基本没有),以后在分享到一些VPS主机优惠的时候穿擦会有从基础到提升的VPS教程,一来是自己学习的记...

PHP开发之THINKPHP多表联合查询操作的三中方法

THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 联合查询        1、原生查询   &nbs...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。