golang exec.Command 执行命令用法实例

目录

cmd字段介绍

用法一:直接在当前目录使用并返回结果

用法二:在命令位置使用并返回结果

用法三:在命令位置使用并实时输出每行结果

用法四:在命令位置使用并实时写入每行结果到文件

用法五:bash -c 方式执行


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 Cmd(commandName string, params []string) (string, error) {
    cmd := exec.Command(commandName, params...)
    fmt.Println("Cmd", cmd.Args)
    var out bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = os.Stderr
    err := cmd.Start()
    if err != nil {
        return "", err
    }
    err = cmd.Wait()
    return out.String(), err
}

用法二:在命令位置使用并返回结果

func CmdAndChangeDir(dir string, commandName string, params []string) (string, error) {
    cmd := exec.Command(commandName, params...)
    fmt.Println("CmdAndChangeDir", dir, cmd.Args)
    var out bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = os.Stderr
    cmd.Dir = dir
    err := cmd.Start()
    if err != nil {
        return "", err
    }
    err = cmd.Wait()
    return out.String(), err
}

用法三:在命令位置使用并实时输出每行结果

func CmdAndChangeDirToShow(dir string, commandName string, params []string) error {
  cmd := exec.Command(commandName, params...)
  fmt.Println("CmdAndChangeDirToFile", dir, cmd.Args)
  //StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道。Wait方法获知命令结束后会关闭这个管道,一般不需要显式的关闭该管道。
  stdout, err := cmd.StdoutPipe()
  if err != nil {
    fmt.Println("cmd.StdoutPipe: ", err)
    return err
  }
  cmd.Stderr = os.Stderr
  cmd.Dir = dir
  err = cmd.Start()
  if err != nil {
    return err
  }
  //创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
  reader := bufio.NewReader(stdout)
  //实时循环读取输出流中的一行内容
  for {
    line, err2 := reader.ReadString('\n')
    if err2 != nil || io.EOF == err2 {
      break
    }
    fmt.Println(line)
  }
  err = cmd.Wait()
  return err
}

用法四:在命令位置使用并实时写入每行结果到文件

func CmdAndChangeDirToFile(fileName, dir, commandName string, params []string) error {
    Path, err := GetCurrentPath()
    if err != nil {
        return err
    }
    Path += "logs/cmdDir/"
    EnsureDir(Path)
    f, err := os.Create(Path + fileName) //创建文件
    defer f.Close()
    cmd := exec.Command(commandName, params...)
    fmt.Println("CmdAndChangeDirToFile", dir, cmd.Args)
    //StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道。Wait方法获知命令结束后会关闭这个管道,一般不需要显式的关闭该管道。
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println("cmd.StdoutPipe: ", err)
        return err
    }
    cmd.Stderr = os.Stderr
    cmd.Dir = dir
    err = cmd.Start()
    if err != nil {
        return err
    }
    //创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
    reader := bufio.NewReader(stdout)
    //实时循环读取输出流中的一行内容
    for {
        line, err2 := reader.ReadString('\n')
        if err2 != nil || io.EOF == err2 {
            break
        }
        _, err = f.WriteString(line) //写入文件(字节数组)
        f.Sync()
    }
    _, err = f.WriteString("=================处理完毕========================") //写入文件(字节数组)
    f.Sync()
    err = cmd.Wait()
    return err
}

用法五:bash -c 方式执行

// 后台运行一个命令 bash -c 方式
func CmdBash(commandName string) *exec.Cmd {
	cmd := exec.Command("/bin/bash", "-c", commandName)
	fmt.Println(line)(cmd.Args)

	go func() {
		var out bytes.Buffer
		cmd.Stdout = &out
		cmd.Stderr = os.Stderr
		_ = cmd.Run()
	}()

	return cmd
}

 

 

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]和\[2\]提供了两个关于在Golang中使用exec.Command函数执行外部命令的示例代码。 在Golang中,exec.Command函数用于创建一个Cmd结构体,该结构体表示要执行的外部命令。可以通过设置Cmd的属性来指定命令的输入、输出和错误流。然后,可以使用Cmd的Start方法来启动命令的执行,并使用Wait方法等待命令执行完成。 在引用\[1\]的示例中,exec.Command函数用于执行Windows命令行(cmd.exe)。通过设置Cmd的Stdin属性,可以将输入绑定到一个缓冲区,然后可以向缓冲区写入命令。通过设置Cmd的Stdout属性,可以将输出绑定到一个缓冲区,以便获取命令的输出结果。 在引用\[2\]的示例中,exec.Command函数用于执行OpenSSL命令。通过设置Cmd的Stdin、Stdout和Stderr属性,可以分别绑定输入、输出和错误流。通过调用Cmd的Start方法启动命令的执行,并使用管道读取命令的输出和错误信息。 总结来说,通过使用exec.Command函数,可以在Golang中执行外部命令,并获取其输出和错误信息。可以通过设置Cmd的属性来指定命令的输入、输出和错误流。然后,可以使用Cmd的Start方法启动命令的执行,并使用Wait方法等待命令执行完成。 #### 引用[.reference_title] - *1* [golang执行命令 exec.Command](https://blog.csdn.net/a19352226/article/details/53747323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [golang exec.Command执行cmd,jar包自定义输入与输出](https://blog.csdn.net/yoorxee/article/details/123323716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值