将进程的标准输出管道传输到另一个标准输出
Piping stdout of Process to another stdout
我正在尝试开始 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 的标准输出(=> 下载进度)还在下载的时候显示它会很整洁,而不仅仅是在结束时。我尝试了很多东西,但无法让这个东西工作。有什么想法吗?
不使用 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.");
}
我正在尝试开始 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 的标准输出(=> 下载进度)还在下载的时候显示它会很整洁,而不仅仅是在结束时。我尝试了很多东西,但无法让这个东西工作。有什么想法吗?
不使用 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.");
}