为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2021-11-22 20:05:02
我开始学习和使用 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 的第一天很有趣。
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

解决方案

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


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

  }

}


查看完整回答
反对 回复 2021-11-22
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

如果你经常需要这个,你必须创建一个助手(5 行看起来太多了)。根据文档,这是推荐的方法:


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)

}


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信