介绍 golang执行系统命令

易霂 · · 11718 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang下的os/exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout。这点和python下的command、os.system等功能是一样的。这里列两个具体操作的代码。其可以调用类LINUX系统下的shell命令,也可以在windows下调用cmd下的命令。

代码一

package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
const ShellToUse = "bash"
func Shellout(command string) (error, string, string) {
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(ShellToUse, "-c", command)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return err, stdout.String(), stderr.String()
}
func main() {
err, out, errout := Shellout("ls -ltr")
if err != nil {
log.Printf("error: %v\n", err)
}
fmt.Println("--- stdout ---")
fmt.Println(out)
fmt.Println("--- stderr ---")
fmt.Println(errout)
}

以上代码执行后,效果如下:

[root@361way go] go run cmd.go
--- stdout ---
total 24
drwxr-xr-x 6 root root 79 Jun 13 2017 src
-rw-r--r-- 1 root root 752 Aug 19 10:55 login.go
-rw-r--r-- 1 root root 1189 Aug 19 14:29 log.go
-rw-r--r-- 1 root root 623 Aug 19 16:43 cmd.go
-rw-r--r-- 1 root root 538 Aug 19 17:41 cmd2.go
-rw-r--r-- 1 root root 519 Aug 19 21:38 http.go
-rw-r--r-- 1 root root 462 Aug 19 22:29 test.py
--- stderr ---

代码二

package main
import (
"fmt"
"os/exec"
)
func Cmd(cmd string, shell bool) []byte {
if shell {
out, err := exec.Command("bash", "-c", cmd).Output()
if err != nil {
panic("some error found")
}
return out
} else {
out, err := exec.Command(cmd).Output()
if err != nil {
panic("some error found")
}
return out
}
}
func main() {
//cmd := "ls -al"
cmd := "python test.py"
//cmd := "python -V" //没有输出
//cmd := "env"
out := string(Cmd(cmd,true))
//out := string(Cmd(cmd,false))
fmt.Println(out)
}

因为都是调用的exec.Command方法并调用bash shell,本质上并没有什么区别。其也可以正常调用python脚本,但在直接调用python -V命令时没有输出,这点感觉很奇怪。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:易霂

查看原文:介绍 golang执行系统命令

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11718 次点击  
加入收藏 微博
上一篇:Go环境搭建
1 回复  |  直到 2021-12-09 09:14:54
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传