在 Go 中执行一个 shell 命令

新手上路,请多包涵

我想在 Go 中执行一个 shell 命令,并在我的程序中将结果输出作为字符串。我看到了 Rosetta 代码 版本:

 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()

但这并没有以我可以编程访问的方式捕获实际的标准输出或错误 - 那些仍然打印到常规的 stdout / stderr。我看到使用 Pipe 作为 out 或 err 可以在其他地方提供帮助,但没有示例说明如何这样做。有任何想法吗?

原文由 Chris Bunch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 548
2 个回答

这个答案并不代表 Go 标准库的当前状态。请查看 @Lourenco 的最新方法的答案


您的示例实际上并未从 stdout 读取数据。这对我有用。

 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()
}

原文由 jimt 发布,翻译遵循 CC BY-SA 4.0 许可协议

包“exec”被 改变 了一点。以下 代码 对我有用。

 package main

import (
    "fmt"
    "os/exec"
)

func main() {
    app := "echo"

    arg0 := "-e"
    arg1 := "Hello world"
    arg2 := "\n\tfrom"
    arg3 := "golang"

    cmd := exec.Command(app, arg0, arg1, arg2, arg3)
    stdout, err := cmd.Output()

    if err != nil {
        fmt.Println(err.Error())
        return
    }

    // Print the output
    fmt.Println(string(stdout))
}

我希望这有帮助!

原文由 Lourenco 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题