I have a shell script with set -x
to have verbose/debug output:
#!/bin/bash
set -x
command1
command2
...
The output looks like this:
+ command1
whatever output from command1
+ command2
whatever output from command2
My problem is, the shell output (caused by set -x
) goes to the stderr, mixed with the output of the commands (command1
, command2
, …). I would be happy to have the "normal" output on the screen (like the script woud run without set -x
) and the "extra" output of bash separately in a file.
So I would like to have this on the screen:
whatever output from command1
whatever output from command2
and this in a log file:
+ command1
+ command2
(also fine if the log file has everything together)
The set -x 2> file
obviously doens't take the right effect, because it's not the output of the set command, but it change the behaviour of the bash.
Using bash 2> file
for the entire script also doesn't do the right thing, because it redirects the stderr of every command which run in this shell as well, so I don't see the error message of the commands.
Best Answer
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 ofset -x
So for example you can do
to send the output of
set -x
to filelogfile
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).