[Whonix-devel] How to create a real copy of file descriptors stdout / stderr?

Patrick Schleizer patrick-mailinglists at whonix.org
Mon Feb 27 01:03:00 CET 2017


Hi,

my goal is to duplicate, redirect all output (stdout and stderr) of an
application (apt-get) to a file while retaining the usual behavior of
apt-get, stdout and stderr.

How to create a real copy of file descriptor stdout and stderr? I would
like to keep stdout and stderr as "natural" as possible. I.e. if it was
running for example apt-get, I would wish to retain colors and progress
information.

By using `tee`, colors and progress information [1] are lost. Therefore
I experimented with using `unbuffer`, however I would appreciate if both
`unbuffer` and `tee` would not required. [2]

The following example is partially functional. (The wrapper does more
stuff, just kept it simple.)

#####

#!/bin/bash

temp_dir="$(mktemp --directory)"
logfile="$temp_dir/log"

exec 3>&1
exec 1> >(tee -a "$logfile")

#exec 4>&2
#exec 2> >(tee -a "$logfile")

unbuffer apt-get "$@"

#####

Broken: stderr redirection. Once I enable...

exec 4>&2
exec 2> >(tee -a "$logfile")

...nothing gets written to stdout anymore. Could you advice please on
how to fix this?

Cheers,
Patrick

[1]
22% [8 Packages 3,449 kB/7,098 kB 49%]
                                                                  174
kB/s 4min 57s
[2] To keep the wrapper simpler and dependent on less external binaries.
Otherwise this could cause conflicts with mandatory access control and
so forth.


More information about the Whonix-devel mailing list