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

时间:2014-01-09 03:55:46

标签: rust

有没有办法调用系统命令,比如Rust中的lsfuser?如何捕获其输出?

4 个答案:

答案 0 :(得分:82)

std::process::Command允许这样做。

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

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

文档中的一个简单示例:

use std::process::Command;

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

答案 1 :(得分:12)

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

答案 2 :(得分:6)

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

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

ProcessOptions'标准文件描述符default to None(创建新管道),因此您只需使用process.output()(例如)从其输出中读取。

如果要运行该命令并在完成后获取所有输出,there’s wait_with_output for that

截至昨天,

Process::new返回Option<Process>而不是Process

答案 3 :(得分:0)

或者您可以尝试使用此板条箱cmd_lib,它是std :: process的包装,以干净,自然和生锈的方式编写类似于任务的shell脚本:

let all_files = run_fun!("ls -a .")?;
// pipe commands are also supported
run_cmd!("du -ah . | sort -hr | head -n 10");