我想在Go语言中执行一个shell命令,并在我的程序中得到一个字符串形式的输出。
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作为输出或错误在其他地方可能会有帮助,但没有示例说明如何这样做。有什么想法吗?
8条答案
按热度按时间h5qlskok1#
包“exec”有点像changed。下面的代码对我很有效。
我希望这对你有帮助!
rslzwgfq2#
提供的答案都不允许区分
stdout
和stderr
,因此我尝试另一个答案。首先,如果你查看
os/exec
包中exec.Cmd
类型的文档,你会得到所有你需要的信息。https://golang.org/pkg/os/exec/#Cmd特别是成员
Stdin
和Stdout
、Stderr
,其中任何io.Reader
都可以用来提供新创建的进程的stdin
,任何io.Writer
都可以用来使用命令的stdout
和stderr
。下面程序中的函数
Shellout
将运行您的命令,并将其输出和错误输出分别作为字符串提供给您。当参数值作为shell命令执行时,请清理在构造参数值时使用的所有外部输入。
在生产中可能不会以这种形式使用它。
bihw5rsg3#
这个答案并不代表Go语言标准库的现状。请看@Lourenco的答案,了解最新的方法!
您的示例实际上并没有从stdout读取数据。
d5vmydt94#
你可以试试这个。
nnvyjq4y5#
下面是一个简单的函数,它将运行您的命令并捕获error、stdout和stderr以供您检查。您可以很容易地看到任何可能出错或报告给您的内容。
您可以像这样使用它(转换媒体文件):
我已经在Go 1.2-1.7中使用了此功能
gmxoilav6#
围棋测试
r7xajy2e7#
我没有让Rosetta的例子在我的Windows Go中工作。最后,我设法用这个命令在Windows的记事本中启动outfile,越过了子进程的旧格式。在一本手册中提到的wait常量参数不存在,所以我只是省略了Wait,因为用户会自己关闭程序或让它打开以重用。
您可以将os.Stdout..更改为os.Pipe,如前面的答案所示
编辑:我得到了它终于从godoc os等待,等待已改变的方法,我成功地做到:
后来我决定
得双曲余切值.
kokeuurv8#
如果您想要与执行进度异步运行长时间运行的脚本,您可以使用
io.MultiWriter
捕获命令输出并将其转发到stdout/stderr
: