如何忽略 Rust 中的管道错误?在 C 语言中,这是免费的:
user@localhost:~ $ cat main.c
#include <stdio.h>
int main(){printf("Hello World!\n");}
user@localhost:~ $ clang main.c -o main
user@localhost:~ $ ./main.exe | echo && echo $?
0
user@localhost:~ $
但是对于 Rust,它的默认行为是对坏管道感到恐慌:
user@localhost:~ $ cat main.rs
fn main(){println!("Hello World!");}
user@localhost:~ $ rustc main.rs
user@localhost:~ $ ./main.exe | echo && echo $?
thread 'main' panicked at library\std\src\io\stdio.rs:1021:9:
failed printing to stdout: The pipe is being closed. (os error 232)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
0
user@localhost:~ $
这篇文章建议重置
SIGPIPE
处理程序,但这对我来说没有用,因为我在Windows上。我在 MSYS2 中运行 zsh
作为我的 shell,但底层操作系统仍然是 Windows,因此符号 libc::SIGPIPE
仍然无法解析 - 而且我从 CMD 或 powershell 运行程序时遇到相同的错误,所以我怀疑这是外壳问题。
有没有办法让我的 Rust 程序像我的 C 程序一样忽略
SIGPIPE
错误?
您可以使用
writeln!
宏代替 println!
并自行处理(或忽略)错误:
fn main() {
let stdout = std::io::stdout();
// ignore errors (assign to _ to silence the warning)
let _ = writeln!(stdout, "Hello World!");
// println! essentially calls `writeln!(...).unwrap()`
}