管道stdout流程到另一个stdout

时间:2015-02-21 16:54:00

标签: process stdout rust

我正在尝试开始卷曲下载,然后将它的stdout传送到我的程序的stdout。这是我得到的(仍然使用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的stdout(=>下载进度)会很简洁,而不仅仅是在最后。我尝试过很多东西,但是不能让这个东西起作用。有什么想法吗?

1 个答案:

答案 0 :(得分: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.");
}