如何在Rust中调用系统命令并捕获其输出?


87

有没有一种方法来调用系统命令,像lsfuser鲁斯特?如何捕获其输出?

Answers:


115

std::process::Command 允许的。

有多种方法可以生成子进程并在计算机上执行任意命令:

  • spawn —运行程序并返回包含详细信息的值
  • output —运行程序并返回输出
  • status —运行程序并返回退出代码

文档中的一个简单示例:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");

2
如果我需要实时输出怎么办。我认为output函数完成处理后会返回Vec。因此,以防万一我们运行类似的内容Command("ping google.com")。是否有可能获得此命令的输出,因为它不会完成,但是我想打印其日志。请提出建议。
GrvTyagi

3
@GrvTyagi:spawn在此答案中提到,返回Child带有标准I / O流的结果。

在此出色答案的基础上,我还发现此答案有助于理解如何与stdin / stdout进行交互。
Michael Noguera

33

来自docs的非常清楚的示例:

use std::process::Command;
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

assert!(output.status.success());

8

确实有可能!相关模块为std::run

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptions'标准文件描述符默认为None(创建一个新管道),因此您可以使用process.output()(例如)从其输出中读取。

如果你想运行的命令,并获得其所有的输出,它的完成之后,还有wait_with_output

Process::new,截至昨天,顺便返回Option<Process>而不是Process


31
对于所有搜索者:std :: run已被删除,请参阅std::io::process(下面的答案)。
jgillich 2014年

2
这是std::process现在的rustc 1.19.0的。
WiSaGaN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.