我开始学习和玩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的第一天有趣。
答案 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)
}