It's well known how to pipe the standard ouput of a process into another processes standard input:
proc1 | proc2
But what if I want to send the standard error of proc1 to proc2 and leave the standard output going to its current location? You would think
bash would have a command along the lines of:
proc1 2| proc2
But, alas, no. Is there any way to do this?
There is also process substitution. Which makes a process substitute for a file.
You can send
stderr to a file as follows:
process1 2> file
But you can substitute a process for the file as follows:
process1 2> >(process2)
Here is a concrete example that sends
stderr to both the screen and appends to a logfile
sh myscript 2> >(tee -a errlog)
You can use the following trick to swap
stderr. Then you just use the regular pipe functionality.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
stderr both pointed to the same place at the start, this will give you what you need.
x>y bit does is to change file handle
x so it now sends its information to where file handle
y currently points. For our specific case:
3>&1creates a new handle
3which will output to the current handle
1(original stdout), just to save it somewhere for the final bullet point below.
1(stdout) to output to the current handle
2(stderr) to output to the current handle
3(original stdout) then closes handle
-at the end).
It's effectively the swap command you see in sorting algorithms:
temp = value1; value1 = value2; value2 = temp;