【问题标题】:Piping stdout of Process to another stdout将 Process 的标准输出连接到另一个标准输出
【发布时间】:2015-02-21 16:53:59
【问题描述】:

我正在尝试开始 curl 下载,然后将它的标准输出通过管道传输到我的程序的标准输出。这是我得到的(仍在使用 old_io):

let process = Command::new("curl")
    .arg("-o ").arg(&self.filename).arg(&self.url)
    .spawn().ok().expect("Download failed.");

let output = process.wait_with_output().ok().expect("Download failed.");

效果很好,但是 curl 下载需要很长时间。因此,在 curl 仍在下载而不是在最后时显示 curl 的标准输出(=> 下载进度)会很整洁。我尝试了很多东西,但无法让这个东西工作。有什么想法吗?

【问题讨论】:

    标签: process stdout rust


    【解决方案1】:

    不使用wait_with_output,而是从process 的一部分管道中读取。当您无法再阅读时,您可以等待该过程。这是一个没有错误处理的示例:

    #![feature(old_io)]
    
    use std::old_io::process::Command;
    use std::old_io::stdio;
    
    fn main() {
        let mut process = Command::new("bash")
            .arg("-c")
            .arg("for i in 1 2 3 4 5; do echo start-$i; sleep 1; echo stop-$i; done")
            .spawn()
            .ok()
            .expect("Command failed");
    
        let buf = &mut [0; 256];
        while let Ok(bytes) = process.stdout.as_mut().unwrap().read(buf) {
            stdio::stdout_raw().write_all(&buf[..bytes]).unwrap();
        }
    
        let _ = process.wait_with_output().ok().expect("Download failed.");
    }
    

    【讨论】:

    • process.stdout.as_mut().unwrap() 放入while 循环并在每次迭代时执行它是惯用的吗?
    • 我不了解惯用语,它只是显示解决方案的一般形状最简单的事情。每当出现问题时,这里的所有“错误处理”都只是针对panic!()。如果您可以避免多次调用,那可能是值得的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多