【问题标题】:Go command output by default to stdout?默认情况下将命令输出到标准输出?
【发布时间】:2015-11-28 06:42:05
【问题描述】:

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

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

有没有办法执行命令并像 shell 脚本一样将其默认为标准输出,还是我需要为此创建一个辅助函数?

更新:在获得 IntelliJ 和 Go 插件后,我在 Go 源代码中四处寻找,并同意目前没有辅助方法是没有办法的。

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

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

我确实将 stdout 选项合并到我自己的助手中,包括其他选项,如 shell 集成。如果我能让它有用的话,我会尝试把它变成开源的。有趣的围棋第一天。

【问题讨论】:

    标签: go


    【解决方案1】:

    解决办法

    实际上,这很容易。您可以将命令的 stdout 设置为 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)
      }
    }
    

    这里发生了什么?

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

    由于os.Stdout 实现了io.Writer 接口,我们只需将cmd.Stdout 设置为os.Stdout。现在,当调用.Run() 时,命令的输出会写入cmd.Stdout 中定义的io.Writer,而os.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)
      }
    }
    

    【讨论】:

    • 这将只为当前命令输出它。如果您要运行下一个exec.command,您仍需要重复该步骤。 OP 希望让它一直运行而不会重复。
    • 我没有这样读过。但我认为您的解决方案也需要重复;) 唯一的区别是我的解决方案在设置期间需要重复,而您的解决方案在输出期间需要重复 并且 需要更多 RAM,因为将输出存储在 @ 987654338@ 而不是复制它;)但是,我会添加一个相应的方式。
    • 是的,这就是我告诉它不可能的原因。因此,如果几行只是一个巨大的负担,那么它创建一个助手的唯一方法。
    • 我希望为多次通话设置一次。答案很有趣,我确实注意到文档提到 Cmd 只能运行一次,因此打破了我重用 Cmd 的希望。无需中间步骤即可将其直接推送到 os.Stdout 似乎更有效,所以我会试试这个。
    【解决方案2】:

    如果你经常需要这个,你必须创建一个助手(而且 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多