【问题标题】:How do I invoke a system command and capture its output?如何调用系统命令并捕获其输出?
【发布时间】:2014-01-27 11:29:51
【问题描述】:

有没有办法调用系统命令,比如 Rust 中的 lsfuser?捕获它的输出怎么样?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

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

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

    文档中的一个简单示例:

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

    【讨论】:

    • 如果我需要实时输出怎么办。我认为output 函数在完成过程后返回 Vec 。所以,如果我们运行类似Command("ping google.com") 的东西。这是否可以获得此命令输出,因为它不会完成,但我想打印它的日志。请提出建议。
    • @GrvTyagi: spawn,在这个答案中提到,返回带有标准 I/O 流的 Child 结果。
    • 基于这个出色的答案,我还发现 this answer 有助于理解如何与标准输入/标准输出交互。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      确实有可能!相关模块为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

      【讨论】:

      • 从 rustc 1.19.0 开始,它是 std::process
      猜你喜欢
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2010-10-13
      • 2014-12-26
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多