一行ずつであれば stdout を read_line して stdin に write するコードを書けば良いけど、シェルスクリプトみたいにその辺を気にしたくなければ unsafe を使ってつなげることができる。
use std::process::{Child, Command, Stdio};
use std::os::unix::io::{AsRawFd, FromRawFd};
fn stdout_to_stdin(process: &Child) -> Option<Stdio> {
if let Some(ref stdout) = process.stdout {
return Some(unsafe { Stdio::from_raw_fd(stdout.as_raw_fd()) });
}
None
}
fn main() {
let mut process1 = Command::new("bash")
.arg("-c")
.arg("while (( i < 100 )); do echo $((i+=1)); done")
.stdout(Stdio::piped())
.spawn().expect("failed to run");
let mut process2 = Command::new("grep")
.arg("1")
.stdin(stdout_to_stdin(&process1).expect("broken pipe"))
.spawn().expect("failed to run");
process1.wait();
process2.wait();
}