在 Go 中执行 shell 命令
我希望在 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()
但这并没有捕获实际的标准输出或错误我可以以编程方式访问的方式 - 这些仍然打印到常规标准输出/标准错误。我发现使用 Pipe 作为 out 或 err 可以在其他地方有所帮助,但没有说明如何这样做的示例。有什么想法吗?
I'm looking to execute a shell command in Go and get the resulting output as a string in my program. I saw the Rosetta Code version:
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()
But this doesn't capture the actual standard out or err in a way that I can programatically access - those still print out to the regular stdout / stderr. I saw that using Pipe as the out or err could help elsewhere, but no example of how to do so. Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
“exec”包改变了一点。以下代码对我有用。
The package "exec" was changed a little bit. The following code worked for me.
提供的答案都不允许将 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 命令执行,因此需要清理
参数构造中使用的所有外部输入
价值。
可能不会在生产中以这种形式使用它。
None of the provided answers allow to separate
stdout
andstderr
so I try another answer.First you get all the info you need, if you look at the documentation of the
exec.Cmd
type in theos/exec
package. Look here: https://golang.org/pkg/os/exec/#CmdEspecially the members
Stdin
andStdout
,Stderr
where anyio.Reader
can be used to feedstdin
of your newly created process and anyio.Writer
can be used to consumestdout
andstderr
of your command.The function
Shellout
in the following programm will run your command and hand you its output and error output separatly as strings.As the parameter value is executed as a shell command, sanitize
all external inputs used in the construction of the parameter
value.
Probably don't use it in this form in production.
此答案并不代表 Go 标准库的当前状态。请查看 @Lourenco 的回答以获取最新方法!
您的示例实际上并未读取来自标准输出的数据。这对我有用。
This answer does not represent the current state of the Go standard library. Please take a look at @Lourenco's answer for an up-to-date method!
Your example does not actually read the data from stdout. This works for me.
你可以试试这个。
you may try this .
使用 exec.Command 函数创建一个新的 cmd 进程,并使用 /C 标志和 dir 命令作为其参数
使用output()方法捕获输出并打印它。
Use the exec.Command function to create a new cmd process with the /C flag and the dir command as its argument
Capture output with output() method and print it.
这是一个简单的函数,它将运行您的命令并捕获错误、标准输出和标准错误以供您检查。您可以轻松地看到任何可能出现问题或向您报告的情况。
你可以像这样使用它(转换媒体文件):
我在 Go 1.2-1.7 中使用过它
Here is a simple function that will run your command and capture the error, stdout, and stderr for you to inspect. You can easily see anything that might go wrong or be reported back to you.
You can use it like this (Converting a media file):
I've used this with Go 1.2-1.7
如果您希望异步运行长时间运行的脚本并显示执行进度,您可以使用
io.MultiWriter
捕获命令输出并将其转发到stdout/stderr
:If you want run long-running script asynchronously with execution progress, you may capture command output using
io.MultiWriter
and forward it tostdout/stderr
:去测试
go test
我没有让 Rosetta 示例在我的 Windows Go 中运行。最后,我设法使用此命令超越子进程的旧格式,在 Windows 的记事本中启动 outfile。一本手册中提到的 wait 常量参数并不存在,所以我只是省略了 Wait,因为用户将自行关闭程序或将其保持打开状态以供重用。
您可以将 os.Stdout.. 更改为 os.Pipe 作为先前的答案
编辑:我终于从 godoc os 等待中得到了它,等待已更改为方法,并且我成功地做到了:
然后我最终决定改为放置
。
I did not get the Rosetta example to work in my Windows Go. Finally I managed to go past the old format of the Subprocess with this command to start outfile in notepad in windows. The wait constant parameter mentioned in one manual did not exist so I just left out Wait as the user will close the program by themself or leave it open to reuse.
You would change the os.Stdout.. to os.Pipe as previous answer
EDIT: I got it finally from godoc os Wait, that Wait has changed to method of and I succeeded to do:
Then I decided finally to put
instead.
我最终这样做是为了获取退出错误代码、命令输出和错误:
在上面答案(以及 stackoverflow 上的其他问题)的帮助下,希望这对某人有帮助。
I ended up doing this to get exit error code, command output and error:
with the help from answers above (and other questions on stackoverflow), hope this helps someone.
这是使用 cmdx 库的一个很好的替代方案,它使执行命令和捕获输出更简单、更
:
有关更多信息,请查看 GitHub 存储库。
Here's a great alternative using the cmdx library that makes executing commands and capturing output simpler and more intuitive:
Explanation
cmdx.RunCommandReturnOutput(command, args...)
: This function runs the specified command with the given arguments and returns the output as a string.For more information, check out the GitHub repository.