您可以创建一个标准输入管道并在其上写入字节。
Command::output
会立即关闭标准输入,因此您必须使用 Command::spawn
。Command::spawn
默认继承stdin。您必须使用 Command::stdin
来更改行为。这是示例(游乐场):
use std::io::{self, Write};
use std::process::{Command, Stdio};
fn main() -> io::Result<()> {
let mut child = Command::new("cat")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.spawn()?;
let child_stdin = child.stdin.as_mut().unwrap();
child_stdin.write_all(b"Hello, world!\n")?;
let output = child.wait_with_output()?;
println!("output = {:?}", output);
Ok(())
}
您需要在创建子流程时请求使用管道。 然后您可以写入管道的写入端,以便将数据传递给子进程。
或者,您可以将数据写入临时文件并指定一个
File
对象。 这样,您就不必将数据分段提供给子进程,如果您还从其标准输出中读取数据,这可能会有点棘手。 (存在死锁的风险。)
如果继承的描述符用于标准输入,则父进程不一定有能力将数据注入其中。