默认情况下将命令输出到stdout?

时间:2015-11-28 06:42:06

标签: go

我开始学习和玩Go来看看制作一些更复杂的控制台/ cli类型工具是什么样的,而不是使用shell或Python。我想执行命令并显示输出。我想出了如何打印输出:

out, err := exec.Command("pwd").Output()
print(string(out))

有没有办法执行命令并将其默认为stdout,就像shell脚本一样,或者我是否需要为此创建一个辅助函数?

更新:获取IntelliJ和Go插件后,我在Go源代码中进行了调查,并同意如果没有帮助方法,目前无法解决这个问题。

根据exec.go源代码中的注释,无法重用Cmd对象:

// A Cmd cannot be reused after calling its Run, Output or CombinedOutput
// methods.

我确实将stdout选项合并到了我自己的帮助器中,包括shell集成等其他选项。如果我能使它变得有用,我会尝试将其转换为开源。 Go的第一天有趣。

2 个答案:

答案 0 :(得分:3)

解决方案

实际上,这很容易。您可以将命令的标准输出设置为os.Stdout,将Bob设置为您的叔叔:

package main

import (
  "os"
  "os/exec"
)

func main() {

  cmd := exec.Command("pwd")

  cmd.Stdout = os.Stdout

  err := cmd.Run()

  if err != nil {
    panic(err)
  }
}

这里发生了什么?

默认情况下,如果bytes.Buffer未设置为cmd.Stdout ,则命令的输出存储在io.Writer 中。然后调用cmd.Output()运行命令并将输出保存到所述缓冲区。

由于os.Stdout实现了io.Writer界面,我们只需将cmd.Stdout设置为os.Stdout即可。现在,当调用.Run()时,命令的输出将写入io.Writer中定义的cmd.Stdout,恰好是os.Stdout,输出将写入shell。

编辑:根据评论,如果所有命令都应写入os.Stdout,那么当然无法阻止某些帮助。我这样做:

package main 

import (
 "os"
 "os/exec"
)

func CmdToStdout( c string ) (err error){
  cmd := exec.Command(c)
  cmd.Stdout = os.Stdout
  err = cmd.Run()
  return
}

func main() {

  err := CmdToStdout("pwd")
  if err != nil {
    panic(err)
  }
}

答案 1 :(得分:1)

如果经常需要帮助,你必须创建一个助手(并且5行看起来太多)。基于documentation这是推荐的方式:

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("date").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The date is %s\n", out)
}