CoolMagma
CoolMagma

Reputation: 55

How to redirect both OUT and ERR to one file and only ERR to another

Hi experts
I want commands out and err is appended to one file, like this command > logOutErr.txt 2>&1
but I also want that err is also appended to another command 2> logErrOnly.txt

# This is a non working redirection
exec 1>> logOutErr.txt 2>> logOutErr.txt 2>> logErrOnly.txt

# This should be in Out log only
echo ten/two: $((10/2))

# This should be in both Out and Out+Err log files
echo ten/zero: $((10/0))

I understand than the last redirect 2>> overrides the preceding ...so what? tee? but how?

I have to do this once at the beginning of the script, without modifying the rest of the script (because it is dynamically generated and any modification is too complicated)

Please don't answer only with links to the theory, I have already spent two days reading everything with no good results, I would like a working example
Thanks

Upvotes: 0

Views: 103

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295383

With the understanding that you lose ordering guarantees when doing this:

#!/usr/bin/env bash
exec >>logOutErr.txt 2> >(tee -a logErrOnly.txt)

# This should be in OutErr
echo "ten/two: $((10/2))"

# This should be in Err and OutErr
echo "ten/zero: $((10/0))"

This works because redirections are processed left-to-right: When tee is started, its stdout is already pointed to logOutErr.txt, so it appends to that location after first writing to logErrOnly.txt.

Upvotes: 4

Related Questions