Redirecting stdout/stderr to multiple files
perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out
Will do what you want.
This is a bit messy, lets go through it step by step.
- We say what used to go to
STDERR
will now goSTDOUT
- We say what used to go to
STDOUT
will now go to errorTestnormal.out.
So now, STDOUT
gets printed to a file, and STDERR
gets printed to STDOUT
. We want put STDERR
into 2 different files, which we can do with tee. tee appends the text it's given to a file, and also echoes to STDOUT
.
- We use
tee
to append toerrorTestnormal.out
, so it now contains all theSTDOUT
andSTDERR
output ofscript.pl
. - Then, we write
STDOUT
oftee
(which containsSTDERR
fromscript.pl
) intoerrorTest.out
After this, errorTestnormal.out
has all the STDOUT
output, and then all the STDERR
output. errotTest.out
contains only the STDERR
output.
I had to mess around with this for a while as well. In order to get stderr in both files, while only putting stdout into a single file (e.g. stderr into errors.log and output.log and then stdout into just output.log) AND in the order that they happen, this command is better:
((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1
The last /dev/nul 2>&1 can be omitted if you want the stdout and stderr to still be output onto the screen.