exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.

func LookPath(file string) (string, error) //LookPath在环境变量中查找科执行二进制文件,如果file中包含一个斜杠,则直接根据绝对路径或者相对本目录的相对路径去查找

  1. func main() {
  2. f, err := exec.LookPath("ls")
  3. if err != nil {
  4. fmt.Println(err)
  5. }
  6. fmt.Println(f) //  /bin/ls
  7. }

type Cmd   //表示一个正在准备或者正在运行的外部命令

  1. type Cmd struct {
  2. Path         string   //运行命令的路径,绝对路径或者相对路径
  3. Args         []string   // 命令参数
  4. Env          []string         //进程环境,如果环境为空,则使用当前进程的环境
  5. Dir          string   //指定command的工作目录,如果dir为空,则comman在调用进程所在当前目录中运行
  6. Stdin        io.Reader  //标准输入,如果stdin是nil的话,进程从null device中读取(os.DevNull),stdin也可以时一个文件,否则的话则在运行过程中再开一个goroutine去
  7.              //读取标准输入
  8. Stdout       io.Writer       //标准输出
  9. Stderr       io.Writer  //错误输出,如果这两个(Stdout和Stderr)为空的话,则command运行时将响应的文件描述符连接到os.DevNull
  10. ExtraFiles   []*os.File   
  11. SysProcAttr  *syscall.SysProcAttr
  12. Process      *os.Process    //Process是底层进程,只启动一次
  13. ProcessState *os.ProcessState  //ProcessState包含一个退出进程的信息,当进程调用Wait或者Run时便会产生该信息.
  14. }

func Command(name string, arg ...string)
*Cmd    //command返回cmd结构来执行带有相关参数的命令,它仅仅设定cmd结构中的Path和Args参数,如果name参数中不包含路径分隔符,command使用LookPath来解决路径问题,否则的话就直接使用name;Args直接跟在command命令之后,所以在Args中不许要添加命令.

  1. func main() {
  2. cmd := exec.Command("tr", "a-z", "A-Z")
  3. cmd.Stdin = strings.NewReader("some input")
  4. var out bytes.Buffer
  5. cmd.Stdout = &out
  6. err := cmd.Run()
  7. if err != nil {
  8. log.Fatal(err)
  9. }
  10. fmt.Printf("in all caps: %q\n", out.String())  //in all caps: "SOME INPUT"
  11. }

func (c *Cmd) CombinedOutput() ([]byte, error) //运行命令,并返回标准输出和标准错误

  1. func main() {
  2. cmd := exec.Command("ls")  //查看当前目录下文件
  3. out, err := cmd.CombinedOutput()
  4. if err != nil {
  5. fmt.Println(err)
  6. }
  7. fmt.Println(string(out))
  8. }

func (c *Cmd) Output() ([]byte, error)     //运行命令并返回其标准输出

  1. func main() {
  2. cmd := exec.Command("ls") ///查看当前目录下文件
  3. out, err := cmd.Output()
  4. if err != nil {
  5. fmt.Println(err)
  6. }
  7. fmt.Println(string(out))
  8. }

注意:Output()和CombinedOutput()不能够同时使用,因为command的标准输出只能有一个,同时使用的话便会定义了两个,便会报错



func (c *Cmd) Run() error          //开始指定命令并且等待他执行结束,如果命令能够成功执行完毕,则返回nil,否则的话边会产生错误

func (c *Cmd) Start() error          //使某个命令开始执行,但是并不等到他执行结束,这点和Run命令有区别.然后使用Wait方法等待命令执行完毕并且释放响应的资源

  1. func main() {
  2. cmd := exec.Command("ls")
  3. cmd.Stdout = os.Stdout //
  4. cmd.Run()
  5. fmt.Println(cmd.Start()) //exec: already started
  6. }

注:一个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

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. )
  7. func main() {
  8. cmd := exec.Command("cat")
  9. stdin, err := cmd.StdinPipe()
  10. if err != nil {
  11. fmt.Println(err)
  12. }
  13. _, err = stdin.Write([]byte("tmp.txt"))
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. stdin.Close()
  18. cmd.Stdout = os.Stdout     //终端标准输出tmp.txt
  19. cmd.Start()
  20. }

func (c *Cmd) StdoutPipe() (io.ReadCloser, error)        //StdoutPipe返回一个连接到command标准输出的管道pipe

  1. func main() {
  2. cmd := exec.Command("ls")
  3. stdout, err := cmd.StdoutPipe()  //指向cmd命令的stdout
  4. cmd.Start()
  5. content, err := ioutil.ReadAll(stdout)
  6. if err != nil {
  7. fmt.Println(err)
  8. }
  9. fmt.Println(string(content))     //输出ls命令查看到的内容
  10. }

func (c *Cmd) Wait()
error             //Wait等待command退出,他必须和Start一起使用,如果命令能够顺利执行完并顺利退出则返回nil,否则的话便会返回error,其中Wait会是放掉所有与cmd命令相关的资源

type Error    //Error返回科执行二进制文件名字不能够执行的原因的错误

  1. type Error struct {
  2. Name string
  3. Err  error
  4. }

func (e *Error) Error() string

type ExitError  //一个command不能够正常退出的error

  1. type ExitError struct {
  2. *os.ProcessState
  3. }

func (e *ExitError) Error() string

golang os/exec 执行外部命令的更多相关文章

  1. [go]os/exec执行shell命令

    // exec基础使用 import ( "os/exec" ) cmd = exec.Command("C:\\cygwin64\\bin\\bash.exe" ...

  2. [golang][译]使用os/exec执行命令

    [golang][译]使用os/exec执行命令 https://colobu.com/2017/06/19/advanced-command-execution-in-Go-with-os-exec ...

  3. php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...

  4. php执行外部命令函数:exec()、passthru()、system()、shell_exec()对比

    PHP提供了4种方法执行系统外部命令:exec().passthru().system().shell_exec(),下面分别介绍: 1.exec 原型:string exec ( string $c ...

  5. Golang os/exec 实现

    os/exec 实现了golang调用shell或者其他OS中已存在的命令的方法. 本文主要是阅读内部实现后的一些总结. 如果要运行ls -rlt,代码如下: package main import ...

  6. PHP在linux上执行外部命令

    PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...

  7. Java中执行外部命令

    在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...

  8. Java 学习笔记 执行外部命令 包装类 枚举类型

    执行外部命令 Runtime只能通过静态方法getRuntime获得,可以用来执行外部的命令 Runtime runtime = Runtime.getRuntime(); runtime.exec( ...

  9. php执行外部命令

    php执行外部命令的不少,例如:exec.shell_exec.system.popen等.我特意的讲一下popen,它跟其他函数不太一样,其他函数执行一个命令后,会等待其返回后,再向下执行,而pop ...

随机推荐

  1. iOS原生APP与H5+JS交互////////////////////zzzz

    原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webView ...

  2. 理解水平扩展和垂直扩展 (转载 http://yunjiechao-163-com.iteye.com/blog/2126981)

      当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选用哪种策略主要依赖于要解决的问题 以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经 ...

  3. Ubuntu14.04台式机r8169有线网卡驱动问题

    由于台式在安装了Ubuntu14.04后插入网线后灯不亮,不能使用有线网. 查找资料发现原来是网卡驱动问题,解决办法如下: 1.查看网卡驱动名称 lspci -v 找到以太网连接的kernel dri ...

  4. [Silverlight]监听指定控件(FrameworkElement)的依赖属性(DependencyProperty)的更改

    前言 转载请注明出处:http://www.cnblogs.com/ainijiutian 最近在silverlight项目使用Telerik的控件,遇到一个问题.就是使用RadBusyIndicat ...

  5. 查询和删除表中重复数据sql语句

      1.查询表中重复数据.select * from peoplewhere peopleId in (select   peopleId   from   people   group   by   ...

  6. 七牛整合php上传从微信下载接口下载下来的文件

    因为ios系统直接读取不了MP3格式的文件,所以从微信接口下载下来的MP3格式音频上传到七牛后要转码.   Sample code:   public function doMobileUploadT ...

  7. Linq对XML的简单操作

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  8. Mvc 模块化开发

    在Mvc中,标准的模块化开发方式是使用Areas,每一个Area都可以注册自己的路由,使用自己的控件器与视图.但是在具体使用上它有如下两个限制 1.必须把视图文件放到主项目的Areas文件夹下才能生效 ...

  9. set、def、lambda、内置函数、文件操作

    set : 无序,不重复,可以嵌套 .add (添加元素) .update(接收可迭代对象)---等于批量 添加 .diffrents()两个集合不同差 .sysmmetric difference( ...

  10. 分页sql优化

    如果分页sql里包含排序: select * from (...order by id) where rownum <=20 因为要排序,所以即使是分页只取20条,执行计划还是要把所有满足条件的 ...