Search code examples
linuxbashstderrio-redirection

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


Solution

  • 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.