gpt4 book ai didi

shell - 如何在 Rust 中通过标准输入向程序发送输入

转载 作者:行者123 更新时间:2023-11-29 07:48:18 26 4
gpt4 key购买 nike

我正在尝试用 Rust 编写一个 shell。 shell 的功能之一是能够将输入重定向到文件,将文件重定向到输入,以及将一个程序的输出通过管道传输到另一个程序。我正在使用 std 中的 run::process_output 函数来运行程序并获取它们的输出,但我不知道如何将输入作为标准输入发送到程序运行后。有什么方法可以创建一个直接连接到运行程序的对象并像在标准输入中输入一样推送输入吗?

最佳答案

这个程序演示了如何启动外部程序并将它们的 stdout -> stdin 一起流式传输:

use std::io::{BufRead, BufReader, BufWriter, Write};
use std::process::{Command, Stdio};

fn main() {
// Create some argument vectors for lanuching external programs
let a = vec!["view", "-h", "file.bam"];
let outsam = vec!["view", "-bh", "-o", "rust.bam", "-"];

let mut child = Command::new("samtools")
.args(&a)
.stdout(Stdio::piped())
.spawn()
.unwrap();
let outchild = Command::new("samtools")
.args(&outsam)
.stdin(Stdio::piped())
.spawn()
.unwrap();

// Create a handle and writer for the stdin of the second process
let mut outstdin = outchild.stdin.unwrap();
let mut writer = BufWriter::new(&mut outstdin);

// Loop over the output from the first process
if let Some(ref mut stdout) = child.stdout {
for line in BufReader::new(stdout).lines() {

let mut l: String = line.unwrap();
// Need to add an end of line character back to the string
let eol: &str = "\n";
l = l + eol;

// Print some select lines from the first child to stdin of second
if (l.chars().skip(0).next().unwrap()) == '@' {
// convert the string into bytes and write to second process
let bytestring = l.as_bytes();
writer.write_all(bytestring).unwrap();
}
}
}
}

关于shell - 如何在 Rust 中通过标准输入向程序发送输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21615188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com