% (sh myscript.sh 3>&2 2>&1 1>&3) 2>/dev/null
I'm stderr
% (sh myscript.sh 3>&2 2>&1 1>&3) >/dev/null
I'm stdout
Explanation of 3>&2 2>&1 1>&3
:
3>&2
means make a copy of file descriptor 2 (fd 2) (stderr), named fd 3 (file descriptor 3). It copies the file descriptor, it doesn’t duplicate the stream astee
does.2>&1
means that fd 2 ofsh myscript.sh
becomes a copy of it’s fd 1 (stdout). Now, when myscript writes to it’s stderr (it’s fd 2), we receive it on stdout (our fd 1).1>&3
means that fd 1 ofsh myscript.sh
becomes a copy of fd 3 (stderr). Now, when myscript writes to it’s stdout (it’s fd 1), we receive it on stderr (our fd 2).