#terminal #tty #isatty #stdio

无std rustix-is-terminal

使用 rustix 测试给定的流是否为终端

1 个不稳定版本

0.4.11 2024年2月9日

#514命令行界面

MIT 许可证

17KB
260

rustix-is-terminal

使用 rustix 测试给定的流是否为终端

Github Actions CI Status crates.io page docs.rs docs

截至 Rust 1.70 版,大多数用户应使用 Rust 标准库中的 IsTerminal 特性,而不是此 crate。

此 crate 与 is-terminal crate 类似,但在其实现中使用 rustix 而不是 libc。这使得它能够在 Unix 类平台支持 no_std


rustix-is-terminal 是一个简单的实用程序,回答一个问题

这是一个终端吗?

"终端",也称为 "tty",是一种 I/O 设备,可能是交互式的,并可能支持颜色和其他特殊功能。此 crate 不提供这些功能;它只回答这个问题。

在 Unix 类平台上,这实际上与测试给定流是否为终端的 isatty 函数相同,尽管它接受高级流类型而不是原始文件描述符。

在 Windows 上,它使用各种技术来确定给定的流是否为终端。

此 crate 是从 atty crate 演变而来,并应用了 PR #51 错误修复和 PR #54 端口到 windows-sys。唯一的区别是,atty crate 只接受 stdin、stdout 或 stderr,而此 crate 接受任何流。特别是,此 crate 不访问任何未传递给它的流,符合 I/O 安全

示例

use rustix_is_terminal::IsTerminal;

fn main() {
    if std::io::stdout().is_terminal() {
        println!("Stdout is a terminal");
    } else {
        println!("Stdout is not a terminal");
    }
}

测试

此库在 Unix 类和 Windows 平台上都进行了测试。

要手动在平台上进行测试,请使用提供的 stdio 示例程序。正常运行时,它打印此内容

$ cargo run --example stdio
stdin? true
stdout? true
stderr? true

要测试 stdin,将一些文本管道到程序

$ cat | cargo run --example stdio
stdin? false
stdout? true
stderr? true

要测试 stdout,将程序管道到某处

$ cargo run --example stdio | cat
stdin? true
stdout? false
stderr? true

要测试 stderr,将程序管道到重定向 stderr 的某处

$ cargo run --example stdio 2>&1 | cat
stdin? true
stdout? false
stderr? false

最低支持的 Rust 版本 (MSRV)

此 crate 目前在 Debian 稳定版 Rust 上运行,当前为 Rust 1.63。此策略可能在未来的次要版本发布中更改,因此使用固定 Rust 版本的用户应将此 crate 锁定到特定版本。

依赖项

~0–10MB
~97K SLoC