Capturing STDERR and STDOUT to file using tee
35,760
The latter; it makes sure STDOUT and STDERR of the original command go to the same fd, then feeds them jointly into tee. In the former case, it's the STDERR of the tee command that you'd be joining with its STDOUT.
Related videos on Youtube
Author by
PP.
Updated on September 17, 2022Comments
-
PP. over 1 year
I'm unclear what the best order is to capture both
STDERR
andSTDOUT
to the same file usingtee
. I know that if I want to pipe to a file I have to map the filehandle after the redirect, i.e.find . >/tmp/output.txt 2>&1
This instructs the shell to send
STDOUT
to/tmp/output.txt
and then to sendSTDERR
toSTDOUT
(which is now sending to/tmp/output.txt
).Attempting to perform the
2>&1
before redirecting the file will not have the desired effect.However when I want to pipe using
tee
should it be:find . |tee /tmp/output.txt 2>&1 # or find . 2>&1 |tee /tmp/output.txt # ?
-
PP. over 13 yearsInterestingly the bash man page says, "If
|&
is used, the standard error of command1 is connected to command2's standard input through the pipe; it is shorthand for2>&1 |
. This implicit redirection of the standard error is performed after any redirections specified by the command." -
eigenfield over 5 yearsI had to create a small C program that writes both to the
stderr
andstdout
to understand this issue. The redirection>
and tee|
operators differs when trying to capture both output streams. For redirection I had to./testapp > /tmp/out.log 2>&1
. Whereas for tee I had to./testapp 2>&1 | tee /tmp/out.log
. -
MadHatter over 5 years@daixtr for what it's worth, the
|
is normally referred to as a pipe operator.tee
refers only to the particular program that's being invoked on the far end of the pipe.