greg7gkb
greg7gkb

Reputation: 5040

Echo bash command to stdout and a log file?

I'd like to know if there's a way in bash have the current command statement printed to both stdout and a log file, in addition to the command's output. For example:

runme.sh:

# do some setup, e.g. create script.log
echo "Fully logged command"

Would write the following to stdout and to script.log:

+ echo 'Fully logged command'
Fully logged command

For example, if I use these lines early in the script:

set -x
exec > >(tee -ai script.log)

This produces the command output from set -x in stdout but not in the log file.

Upvotes: 1

Views: 1081

Answers (1)

Robidu
Robidu

Reputation: 613

I have done a bit of testing, and as it appears, set -x prints its messages to stderr. This, however, means that you need to redirect stderr to stdout and pipe stdout to tee.

So if you are doing this:

set -x
exec 2>&1 > >(tee -ai output.log)

... you are neatly getting everything that Bash executes in your log file as well, together with any output produced by any commands that you are executing.

But beware: Any formatting that may be applied by your programs are lost.

As a side note, as has been explained in some answers here, any pipes are created before any redirections take effect. So when you are redirecting stderr to a piped stdout, that is also going to wind up in said pipe.

Upvotes: 1

Related Questions