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

是否有方法调用系统命令,如 Rust 中的 lsfuser? 如何捕获它的输出?

59855 次浏览

这确实是可能的! 相关的模块是 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

std::process::Command 考虑到这一点。

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

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

来自文档的一个简单例子:

use std::process::Command;


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

来自 医生的一个非常明显的例子:

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());