默认情况下将命令输出转到标准输出?

我开始学习和使用 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 的第一天很有趣。


神不在的星期二
浏览 202回答 2
2回答

阿晨1998

解决方案实际上,这很容易。您可以将命令的标准输出设置为os.StdoutBob 是您的叔叔:package mainimport (  "os"  "os/exec")func main() {  cmd := exec.Command("pwd")  cmd.Stdout = os.Stdout  err := cmd.Run()  if err != nil {    panic(err)  }}这里发生了什么事?默认情况下,命令的输出存储在bytes.Buffer ifcmd.Stdout未设置为 another 中io.Writer。然后调用cmd.Output()运行命令并将输出保存到所述缓冲区。由于os.Stdout实现了io.Writer接口,我们简单地设置cmd.Stdout为os.Stdout. 现在当.Run()被调用时,命令的输出被写入io.Writer定义的 in 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)  }}

拉风的咖菲猫

如果你经常需要这个,你必须创建一个助手(5 行看起来太多了)。根据文档,这是推荐的方法:package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go