我想在Go中执行一个shell命令,并将生成的输出作为一个字符串在我的程序中。我看到了
Rosetta Code版本:
package main import "fmt" import "exec" func main() { cmd,err := exec.Run("/bin/ls",[]string{"/bin/ls"},[]string{},"",exec.DevNull,exec.PassThrough,exec.PassThrough) if (err != nil) { fmt.Println(err) return } cmd.Close()
但是,这并不能以一种我可以编程访问的方式捕获实际的标准输出或者错误 – 那些仍然打印到常规的stdout / stderr。我看到使用Pipe作为out或者err可以帮助别的地方,但没有一个例子。有任何想法吗?
该答案不代表Go标准库的当前状态。请查看@ Lourenco的答案以获得最新的方法!
您的示例实际上并没有从stdout读取数据。这对我有用
package main import ( "fmt" "exec" "os" "bytes" "io" ) func main() { app := "/bin/ls" cmd,err := exec.Run(app,[]string{app,"-l"},nil,exec.Pipe,exec.Pipe) if (err != nil) { fmt.Fprintln(os.Stderr,err.String()) return } var b bytes.Buffer io.Copy(&b,cmd.Stdout) fmt.Println(b.String()) cmd.Close() }