我想要从一个子进程中读取stderr和stdout的输出,但是它没有起作用。
main.rs
这段代码只读取标准输出:
如果我在这段代码中删除所有与标准输出相关的内容,只留下标准错误输出,它就会仅读取标准错误输出:
产生
它似乎只能同时读取stdout或stderr中的一个,而不能同时读取两者。我做错了什么吗?
我正在使用Rust 1.26.0-nightly (322d7f7b9 2018-02-25)。
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
如果我在这段代码中删除所有与标准输出相关的内容,只留下标准错误输出,它就会仅读取标准错误输出:
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())
);
产生
err: on stderr
它似乎只能同时读取stdout或stderr中的一个,而不能同时读取两者。我做错了什么吗?
我正在使用Rust 1.26.0-nightly (322d7f7b9 2018-02-25)。