用 Rust 处理管道数据标准输入
Handling piped data stdin with Rust
我在使用 Rust 中的标准输入时遇到问题。我正在尝试处理来自 linux 终端管道的标准输入,例如 grep。
echo "lorem ipsum" | grep <text>
我在 Rust 中使用它:
fn load_stdin() -> Result<String> {
let mut buffer = String::new();
let stdin = stdin();
stdin.read_line(&mut buffer)?;
return Ok(buffer);
}
但问题是,如果我不引入任何管道数据,系统会提示我写入,我想 return Err.
所以基本上,如果我做类似的事情:
ls | cargo run
user@machine: ~ $
一切都很好。但是如果我不通过管道传输任何标准输入:
cargo run
程序暂停并等待用户输入。
您可以使用 atty
crate 来测试您的标准输入是否被重定向:
use std::io;
use atty::Stream;
fn load_stdin() -> io::Result<String> {
if atty::is(Stream::Stdin) {
return Err(io::Error::new(io::ErrorKind::Other, "stdin not redirected"));
}
let mut buffer = String::new();
io::stdin().read_line(&mut buffer)?;
return Ok(buffer);
}
fn main() -> io::Result<()> {
println!("line: {}", load_stdin()?);
Ok(())
}
这会产生所需的行为:
$ echo "lorem ipsum" | cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/playground`
line: lorem ipsum
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/playground`
Error: Custom { kind: Other, error: "stdin not redirected" }
我在使用 Rust 中的标准输入时遇到问题。我正在尝试处理来自 linux 终端管道的标准输入,例如 grep。
echo "lorem ipsum" | grep <text>
我在 Rust 中使用它:
fn load_stdin() -> Result<String> {
let mut buffer = String::new();
let stdin = stdin();
stdin.read_line(&mut buffer)?;
return Ok(buffer);
}
但问题是,如果我不引入任何管道数据,系统会提示我写入,我想 return Err.
所以基本上,如果我做类似的事情:
ls | cargo run
user@machine: ~ $
一切都很好。但是如果我不通过管道传输任何标准输入:
cargo run
程序暂停并等待用户输入。
您可以使用 atty
crate 来测试您的标准输入是否被重定向:
use std::io;
use atty::Stream;
fn load_stdin() -> io::Result<String> {
if atty::is(Stream::Stdin) {
return Err(io::Error::new(io::ErrorKind::Other, "stdin not redirected"));
}
let mut buffer = String::new();
io::stdin().read_line(&mut buffer)?;
return Ok(buffer);
}
fn main() -> io::Result<()> {
println!("line: {}", load_stdin()?);
Ok(())
}
这会产生所需的行为:
$ echo "lorem ipsum" | cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/playground`
line: lorem ipsum
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/playground`
Error: Custom { kind: Other, error: "stdin not redirected" }