20.1.5. 持续处理子进程的输出
在运行外部命令并处理-stdout 实例中,直到外部命令 Command
完成,stdout 的处理才开始。下面的实例调用 Stdio::piped
创建管道,并在 BufReader
被更新后立即读取 stdout
,持续不断地处理。
下面的实例等同于 Unix shell 命令 journalctl | grep usb
。
use std::process::{Command, Stdio}; use std::io::{BufRead, BufReader, Error, ErrorKind}; fn main() -> Result<(), Error> { let stdout = Command::new("journalctl") .stdout(Stdio::piped()) .spawn()? .stdout .ok_or_else(|| Error::new(ErrorKind::Other,"Could not capture standard output."))?; let reader = BufReader::new(stdout); reader .lines() .filter_map(|line| line.ok()) .filter(|line| line.find("usb").is_some()) .for_each(|line| println!("{}", line)); Ok(()) }