smol/examples/process-output.rs

36 lines
955 B
Rust

// TODO: document
use std::env;
use std::process::{Command, Stdio};
use futures::io;
use futures::prelude::*;
use smol::blocking;
fn main() -> io::Result<()> {
smol::run(async {
let mut args = env::args().skip(1);
let mut cmd = Command::new(args.next().expect("missing program name"));
for arg in args {
cmd.arg(arg);
}
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::piped());
let mut child = cmd.spawn()?;
let child_out = smol::reader(child.stdout.take().unwrap());
let child_err = smol::reader(child.stderr.take().unwrap());
let mut stdout = smol::writer(std::io::stdout());
let mut stderr = smol::writer(std::io::stderr());
future::try_join(
io::copy(child_out, &mut stdout),
io::copy(child_err, &mut stderr),
)
.await?;
println!("{}", blocking!(child.wait())?);
Ok(())
})
}