top of page

How can I log all commands and their outputs, including errors, to a file?

This post answers the question, "How can I log all commands and their outputs, including errors, to a file?"


Log all Commands and their Outputs, Including Errors, to a File

exec > >(tee -i output.log) 2>&1

Description

  • Process Substitution Setup:

  • The shell identifies the process substitution part >(tee -i output.log).

  • A subshell is created to execute tee -i output.log.

  • The subshell running tee provides a file descriptor (let's call it FD1) that acts like a temporary file.

  • Exec Command with Stdout Redirection:

  • exec > FD1: The exec command changes the file descriptor for the current shell.

  • The standard output (stdout, file descriptor 1) of the current shell is redirected to FD1 (the file descriptor provided by the tee subshell).

  • Stderr Redirection to Stdout:

  • 2>&1: The standard error (stderr, file descriptor 2) is redirected to the current destination of stdout (file descriptor 1).

  • Since stdout has already been redirected to FD1 (the tee subshell), stderr will also be redirected to FD1.

  • Execution of tee Command:

  • The tee command reads from FD1 (which now receives both stdout and stderr from the shell).

  • tee writes the received output to both output.log and the console (stdout of the tee subshell).


Example Application

Trace and capture bash script execution.

set -x
exec > >(tee -i output.log) 2>&1
bash script

Additional Information

See:



https://www.gnu.org/graphics/heckert_gnu.transp.small.png

bottom of page