bash: set -x logs to file
Based on this ServerFault answer Send bash -x output to logfile without interupting standard output, modern versions of bash include a BASH_XTRACEFD
specifically for specifying an alternate file descriptor for the output of set -x
So for example you can do
#!/bin/bash
exec 19>logfile
BASH_XTRACEFD=19
set -x
command1
command2
...
to send the output of set -x
to file logfile
while preserving regular standard output and standard error streams for the following commands.
Note the use of fd 19 is arbitrary - it just needs to be an available descriptor (i.e. not 0, 1, 2 or another number that you have already allocated).
Steeldriver gave you one approach. Alternatively, you can simply redirect STDERR to a file:
script.sh 2> logfile
That, however, means that both the output created by the set -x
option and any other error messages produced will go to the file. Steeldriver's solution will only redirect the set -x
output which is probably what you want.
After more than a year I've found the right solution to have both the "normal" output (stdout + stderr - bash trace) on the screen and all together (stdout + stderr + bash trace) in a file (bash.log):
exec > >(tee -ia bash.log)
exec 2> >(tee -ia bash.log >& 2)
exec 19> bash.log
export BASH_XTRACEFD="19"
set -x
command1
command2