我想从子进程中读取 stderr 和 stdout,但它不起作用。
main.rs
use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};
fn main() {
let mut child = Command::new("./1.sh")
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()
.unwrap();
let out = BufReader::new(child.stdout.take().unwrap());
let err = BufReader::new(child.stderr.take().unwrap());
out.lines().for_each(|line|
println!("out: {}", line.unwrap())
);
err.lines().for_each(|line|
println!("err: {}", line.unwrap())
);
let status = child.wait().unwrap();
println!("{}", status);
}
1.sh
#!/bin/bash
counter=100
while [ $counter -gt 0 ]
do
sleep 0.1
echo "on stdout"
echo "on stderr" >&2
counter=$(( $counter - 1 ))
done
exit 0
此代码仅读取标准输出:
out: on stdout
如果我删除此代码中与 stdout 相关的所有内容并仅保留 stderr ,它将仅读取 stderr:
let mut child = Command::new("./1.sh")
.stdout(Stdio::null())
.stderr(Stdio::piped())
.spawn()
.unwrap();
let err = BufReader::new(child.stderr.take().unwrap());
err.lines().for_each(|line|
println!("err: {}", line.unwrap())
);
Produces
err: on stderr
看起来它可以一次读取 stdout 或 stderr,但不能同时读取两者。我究竟做错了什么?
我正在使用 Rust 1.26.0-nightly (322d7f7b9 2018-02-25)