Reputation: 648
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.
Upvotes: 13
Views: 11134
Reputation: 1330
The command below will do what you want.
perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out`
This is a bit messy, so 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.
Upvotes: 24
Reputation: 683
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.
Upvotes: 3
Reputation: 28728
I guess in case of the 2nd ">" you try to send the error output of errorTestnormal.out
(and not that of script.pl
) to errorTest.out
.
Upvotes: 0