golang os/exec 执行外部命令
exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.
func LookPath(file string) (string, error) //LookPath在环境变量中查找科执行二进制文件,如果file中包含一个斜杠,则直接根据绝对路径或者相对本目录的相对路径去查找
- func main() {
- f, err := exec.LookPath("ls")
- if err != nil {
- fmt.Println(err)
- }
- fmt.Println(f) // /bin/ls
- }
type Cmd //表示一个正在准备或者正在运行的外部命令
- type Cmd struct {
- Path string //运行命令的路径,绝对路径或者相对路径
- Args []string // 命令参数
- Env []string //进程环境,如果环境为空,则使用当前进程的环境
- Dir string //指定command的工作目录,如果dir为空,则comman在调用进程所在当前目录中运行
- Stdin io.Reader //标准输入,如果stdin是nil的话,进程从null device中读取(os.DevNull),stdin也可以时一个文件,否则的话则在运行过程中再开一个goroutine去
- //读取标准输入
- Stdout io.Writer //标准输出
- Stderr io.Writer //错误输出,如果这两个(Stdout和Stderr)为空的话,则command运行时将响应的文件描述符连接到os.DevNull
- ExtraFiles []*os.File
- SysProcAttr *syscall.SysProcAttr
- Process *os.Process //Process是底层进程,只启动一次
- ProcessState *os.ProcessState //ProcessState包含一个退出进程的信息,当进程调用Wait或者Run时便会产生该信息.
- }
func Command(name string, arg ...string)
*Cmd //command返回cmd结构来执行带有相关参数的命令,它仅仅设定cmd结构中的Path和Args参数,如果name参数中不包含路径分隔符,command使用LookPath来解决路径问题,否则的话就直接使用name;Args直接跟在command命令之后,所以在Args中不许要添加命令.
- func main() {
- cmd := exec.Command("tr", "a-z", "A-Z")
- cmd.Stdin = strings.NewReader("some input")
- var out bytes.Buffer
- cmd.Stdout = &out
- err := cmd.Run()
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("in all caps: %q\n", out.String()) //in all caps: "SOME INPUT"
- }
func (c *Cmd) CombinedOutput() ([]byte, error) //运行命令,并返回标准输出和标准错误
- func main() {
- cmd := exec.Command("ls") //查看当前目录下文件
- out, err := cmd.CombinedOutput()
- if err != nil {
- fmt.Println(err)
- }
- fmt.Println(string(out))
- }
func (c *Cmd) Output() ([]byte, error) //运行命令并返回其标准输出
- func main() {
- cmd := exec.Command("ls") ///查看当前目录下文件
- out, err := cmd.Output()
- if err != nil {
- fmt.Println(err)
- }
- fmt.Println(string(out))
- }
注意:Output()和CombinedOutput()不能够同时使用,因为command的标准输出只能有一个,同时使用的话便会定义了两个,便会报错
func (c *Cmd) Run() error //开始指定命令并且等待他执行结束,如果命令能够成功执行完毕,则返回nil,否则的话边会产生错误
func (c *Cmd) Start() error //使某个命令开始执行,但是并不等到他执行结束,这点和Run命令有区别.然后使用Wait方法等待命令执行完毕并且释放响应的资源
- func main() {
- cmd := exec.Command("ls")
- cmd.Stdout = os.Stdout //
- cmd.Run()
- fmt.Println(cmd.Start()) //exec: already started
- }
注:一个command只能使用Start()或者Run()中的一个启动命令,不能两个同时使用.
func (c *Cmd) StderrPipe() (io.ReadCloser, error) //StderrPipe返回一个pipe,这个管道连接到command的标准错误,当command命令退出时,Wait将关闭这些pipe
func (c *Cmd) StdinPipe() (io.WriteCloser, error) //StdinPipe返回一个连接到command标准输入的管道pipe
- package main
- import (
- "fmt"
- "os"
- "os/exec"
- )
- func main() {
- cmd := exec.Command("cat")
- stdin, err := cmd.StdinPipe()
- if err != nil {
- fmt.Println(err)
- }
- _, err = stdin.Write([]byte("tmp.txt"))
- if err != nil {
- fmt.Println(err)
- }
- stdin.Close()
- cmd.Stdout = os.Stdout //终端标准输出tmp.txt
- cmd.Start()
- }
func (c *Cmd) StdoutPipe() (io.ReadCloser, error) //StdoutPipe返回一个连接到command标准输出的管道pipe
- func main() {
- cmd := exec.Command("ls")
- stdout, err := cmd.StdoutPipe() //指向cmd命令的stdout
- cmd.Start()
- content, err := ioutil.ReadAll(stdout)
- if err != nil {
- fmt.Println(err)
- }
- fmt.Println(string(content)) //输出ls命令查看到的内容
- }
func (c *Cmd) Wait()
error //Wait等待command退出,他必须和Start一起使用,如果命令能够顺利执行完并顺利退出则返回nil,否则的话便会返回error,其中Wait会是放掉所有与cmd命令相关的资源
type Error //Error返回科执行二进制文件名字不能够执行的原因的错误
- type Error struct {
- Name string
- Err error
- }
func (e *Error) Error() string
type ExitError //一个command不能够正常退出的error
- type ExitError struct {
- *os.ProcessState
- }
func (e *ExitError) Error() string
golang os/exec 执行外部命令的更多相关文章
- [go]os/exec执行shell命令
// exec基础使用 import ( "os/exec" ) cmd = exec.Command("C:\\cygwin64\\bin\\bash.exe" ...
- [golang][译]使用os/exec执行命令
[golang][译]使用os/exec执行命令 https://colobu.com/2017/06/19/advanced-command-execution-in-Go-with-os-exec ...
- php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()
目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...
- php执行外部命令函数:exec()、passthru()、system()、shell_exec()对比
PHP提供了4种方法执行系统外部命令:exec().passthru().system().shell_exec(),下面分别介绍: 1.exec 原型:string exec ( string $c ...
- Golang os/exec 实现
os/exec 实现了golang调用shell或者其他OS中已存在的命令的方法. 本文主要是阅读内部实现后的一些总结. 如果要运行ls -rlt,代码如下: package main import ...
- PHP在linux上执行外部命令
PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...
- Java中执行外部命令
在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...
- Java 学习笔记 执行外部命令 包装类 枚举类型
执行外部命令 Runtime只能通过静态方法getRuntime获得,可以用来执行外部的命令 Runtime runtime = Runtime.getRuntime(); runtime.exec( ...
- php执行外部命令
php执行外部命令的不少,例如:exec.shell_exec.system.popen等.我特意的讲一下popen,它跟其他函数不太一样,其他函数执行一个命令后,会等待其返回后,再向下执行,而pop ...
随机推荐
- JAVA内存管理之堆内存和栈内存
我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆 ...
- Mac下好用的编辑器VIM GUI版本 VimR 推荐
vim号称是编辑器之神,轮其功能和扩展性的确少有编辑器能比,但是大多数编辑器都有的文件浏览功能它确没有,虽然有些插件可以实现,但用起来都不是很方便,偶然发现了一个GUI版本的VIM,与普通的GUI版本 ...
- Java表单中关于JavaScript的非空必输验证,你的程序和大牛有多少差距╮( ̄▽ ̄")╭
var defaultEmptyOK = false; // スペース var whitespace = " \t\n\r "; function checkNull (theFi ...
- sklearn 增量学习 数据量大
问题 实际处理和解决机器学习问题过程中,我们会遇到一些"大数据"问题,比如有上百万条数据,上千上万维特征,此时数据存储已经达到10G这种级别.这种情况下,如果还是直接使用传统的方式 ...
- [转]MySQL innodb buffer pool
最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...
- 什么是Unicode letter
起因:从一段代码说起 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- c#DataGridView数据绑定示例——格式化单元格的内容(转)
转自http://blog.csdn.net/testcs_dn/article/details/37834063 c#DataGridView数据绑定示例 格式化单元格的内容 在使用DataGrid ...
- GoLang语言
1 Go语言基础 1.1 语法详解 1.1.1 注释 /* regexp 包为正则表达式实现了一个简单的库. 该库接受的正则表达式语法为: 正则表达式: 串联 { '|' 串联 } 串联: { 闭包 ...
- js中arguments的用法
了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...
- laravel框架总结(十三) -- redis使用
一切的前提都是已经安装好了redis服务器,并且能启动(我只总结了mac的安装方法:传送门) 我自己使用的是mac系统,有个教程可以参考下,传送门: 1.安装PHP PRedis 1>PRedi ...