【发布时间】:2018-08-10 06:56:54
【问题描述】:
我想从子进程中同时读取 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())
);
生产
err: on stderr
它似乎可以一次读取 stdout 或 stderr,但不能同时读取。我做错了什么?
我每晚使用 Rust 1.26.0 (322d7f7b9 2018-02-25)
【问题讨论】: