faketty 1.0.17

Wrapper to exec a command in a pty, even if redirecting the output
faketty-1.0.17 is not a library.

faketty

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.

$ cargo install faketty
$ 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.

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