| <div align="center"> |
| <h1><code>is-terminal</code></h1> |
| |
| <p> |
| <strong>Test whether a given stream is a terminal</strong> |
| </p> |
| |
| <p> |
| <a href="https://github.com/sunfishcode/is-terminal/actions?query=workflow%3ACI"><img src="https://github.com/sunfishcode/is-terminal/workflows/CI/badge.svg" alt="Github Actions CI Status" /></a> |
| <a href="https://crates.io/crates/is-terminal"><img src="https://img.shields.io/crates/v/is-terminal.svg" alt="crates.io page" /></a> |
| <a href="https://docs.rs/is-terminal"><img src="https://docs.rs/is-terminal/badge.svg" alt="docs.rs docs" /></a> |
| </p> |
| </div> |
| |
| is-terminal is a simple utility that answers one question: |
| |
| > Is this a terminal? |
| |
| A "terminal", also known as a "tty", is an I/O device which may be interactive |
| and may support color and other special features. This crate doesn't provide |
| any of those features; it just answers this one question. |
| |
| On Unix-family platforms, this is effectively the same as the [`isatty`] |
| function for testing whether a given stream is a terminal, though it accepts |
| high-level stream types instead of raw file descriptors. |
| |
| On Windows, it uses a variety of techniques to determine whether the given |
| stream is a terminal. |
| |
| This crate is derived from [the atty crate] with [PR \#51] bug fix and |
| [PR \#54] port to windows-sys applied. The only additional difference is that |
| the atty crate only accepts stdin, stdout, or stderr, while this crate accepts |
| any stream. In particular, this crate does not access any stream that is not |
| passed to it, in accordance with [I/O safety]. |
| |
| [PR \#51]: https://github.com/softprops/atty/pull/51 |
| [PR \#54]: https://github.com/softprops/atty/pull/54 |
| |
| ## Example |
| |
| ```rust |
| use is_terminal::IsTerminal; |
| |
| fn main() { |
| if std::io::stdout().is_terminal() { |
| println!("Stdout is a terminal"); |
| } else { |
| println!("Stdout is not a terminal"); |
| } |
| } |
| ``` |
| |
| ## Testing |
| |
| This library is tested on both Unix-family and Windows platforms. |
| |
| To test it on a platform manually, use the provided `stdio` example program. |
| When run normally, it prints this: |
| |
| ```bash |
| $ cargo run --example stdio |
| stdin? true |
| stdout? true |
| stderr? true |
| ``` |
| |
| To test stdin, pipe some text to the program: |
| |
| ```bash |
| $ cat | cargo run --example stdio |
| stdin? false |
| stdout? true |
| stderr? true |
| ``` |
| |
| To test stdout, pipe the program to something: |
| |
| ```bash |
| $ cargo run --example stdio | cat |
| stdin? true |
| stdout? false |
| stderr? true |
| ``` |
| |
| To test stderr, pipe the program to something redirecting stderr: |
| |
| ```bash |
| $ cargo run --example stdio 2>&1 | cat |
| stdin? true |
| stdout? false |
| stderr? false |
| ``` |
| |
| # Minimum Supported Rust Version (MSRV) |
| |
| This crate currently works on the version of [Rust on Debian stable], which is |
| currently Rust 1.48. This policy may change in the future, in minor version |
| releases, so users using a fixed version of Rust should pin to a specific |
| version of this crate. |
| |
| [`isatty`]: https://man7.org/linux/man-pages/man3/isatty.3.html |
| [the atty crate]: https://crates.io/crates/atty |
| [I/O safety]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md |
| [Rust on Debian stable]: https://packages.debian.org/stable/rust/rustc |