I was wondering how to redirect stderr to multiple outputs. I tried it with this script, but I couldn't get it to work quite right. The first file should have both stdout and stderr, and the 2nd should just have errors.
perl script.pl &> errorTestnormal.out &2> errorTest.out
Is there a better way to do this? Any help would be much appreciated. Thank you.
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.
STDERR
will now go STDOUT
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
.
tee
to append to errorTestnormal.out
, so it now contains all the STDOUT
and STDERR
output of script.pl
.STDOUT
of tee
(which contains STDERR
from script.pl
) into errorTest.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With