faketty
=======
[](https://github.com/dtolnay/faketty)
[](https://crates.io/crates/faketty)
[](https://github.com/dtolnay/faketty/actions?query=branch%3Amaster)
A wrapper binary to exec a command in a pty, even if redirecting the output.
This allows logging the stdout and stderr (separately) of a process, without the
output being different from what you'd see in the terminal if you weren't
logging anything.
```console
$ cargo install faketty
```
```console
$ faketty bazel build :target >log/out 2>log/err
~~~~~~~~~~~~~~~~~~~ command to run
```
## Background
When redirecting stdout/err to a pipe or file, a process may detect the output
is no longer going to a tty (because it has no width/height, baud rate, etc) and
may change its behavior accordingly. For example many programs that involve a
progress bar or colored text in a terminal disable those things when the output
is not going to a terminal.
There is a [script(1)] command which makes it possible to redirect a command's
terminal-style output by executing it inside a pseudoterminal (pty) – a
bidirectional pipe that also has width, height, etc and tricks the process into
thinking it is talking to a real terminal. However, `script` only uses a single
pty, which makes it impossible to demultiplex stdout and stderr to different
places.
[script(1)]: https://man7.org/linux/man-pages/man1/script.1.html
The `faketty` command in this repo is similar to `script --quiet --return
--command '...' /dev/null` except that it preserves distinct stdout and stderr
streams.
#### License
Licensed under either of Apache License, Version
2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in this program by you, as defined in the Apache-2.0 license,
shall be dual licensed as above, without any additional terms or conditions.