dongzhashou0116 2011-05-31 02:18
浏览 276
已采纳

在Go中执行Shell命令

I'm looking to execute a shell command in Go and get the resulting output as a string in my program. I saw the Rosetta Code version:

package main
import "fmt"
import "exec"

func main() {
  cmd, err := exec.Run("/bin/ls", []string{"/bin/ls"}, []string{}, "", exec.DevNull, exec.PassThrough, exec.PassThrough)
  if (err != nil) {
    fmt.Println(err)
    return
  }
  cmd.Close()

But this doesn't capture the actual standard out or err in a way that I can programatically access - those still print out to the regular stdout / stderr. I saw that using Pipe as the out or err could help elsewhere, but no example of how to do so. Any ideas?

  • 写回答

6条回答 默认 最新

  • dpswo40440 2011-05-31 03:01
    关注

    This answer does not represent the current state of the Go standard library. Please take a look at @Lourenco's answer for an up-to-date method!


    Your example does not actually read the data from stdout. This works for me.

    package main
    
    import (
       "fmt"
       "exec"
       "os"
       "bytes"
       "io"
    )
    
    func main() {
        app := "/bin/ls"
        cmd, err := exec.Run(app, []string{app, "-l"}, nil, "", exec.DevNull, exec.Pipe, exec.Pipe)
    
        if (err != nil) {
           fmt.Fprintln(os.Stderr, err.String())
           return
        }
    
        var b bytes.Buffer
        io.Copy(&b, cmd.Stdout)
        fmt.Println(b.String())
    
        cmd.Close()
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?