3.Nope. The ordering matters, so it gets rid of the original stdout, then it moves stderr to stdout.
4.3
is just another file descriptor, same as the first 3. Most processes can use a total of 256 different file descriptors.
3.Nope. The ordering matters, so it gets rid of the original stdout, then it moves stderr to stdout.
4.3
is just another file descriptor, same as the first 3. Most processes can use a total of 256 different file descriptors.
Though documented in the perldocs, the redirection is all standard linux redirection. You understand 1 and 2 correctly.
3) Only STDOUT is normally caught by a basic redirect (>
), so the original STDOUT must be discarded, and STDERR must be send to STDOUT.
4) cmd 3>&1 1>&2 2>&3 3>&-
is equivalent to
var tmp = STDOUT;
STDOUT = STDERR;
STDERR = tmp;
delete tmp;
Really, none of this is Perl -- all of this is handled by the shell that you're invoking by using the backticks operator. So your best reading is man sh
, or the Shell chapter of the Unix standard.
In short, though, for #4:
3>&1
: Open FD 3 to point to where stdout currently points.1>&2
: Reopen stdout to point to where stderr currently points.2>&3
: Reopen stderr to point to where FD 3 currently points, which is where stdout pointed before the previous step was completed. Now stdout and stderr have been succesfully swapped.3>&-
: Close FD 3 because it's not needed anymore.Normally we have this:
1-->STDOUT
2-->STDERR
2>&1
redirects file descriptor fd2
to fd1
1-->STDOUT
/
2./
2>/dev/null
redirects fd2
to /dev/null
.
1-->STDOUT
2-->/dev/null
2>&1 1>/dev/null
redirects fd2
to fd1
, and then redirects fd1
to /dev/null
/dev/null
/
1./ STDOUT
/
2./
3>&1 1>&2 2>&3 3>&-
The whole thing effectively swaps fd1 and fd2. fd3 acted as a temporary variable.
1 --STDOUT
X
2 `-STDERR
See the docs for more information on IO redirection.