http://www.perlmonks.org?node_id=1045381

tange has asked for the wisdom of the Perl Monks concerning the following question:

open3 only takes STDIN, STDOUT and STDERR. If the command being run uses other file descriptors then open3 cannot capture those:

echo foo # Can be captured echo foo >&2 # Can be captured echo foo >&3 # Cannot be captured (with open3)
I have looked into IPC::Run::run which seems to be able to deal with that, but I also need the PID and I found no way for IPC::Run::run to give me that. Also IPC::Run is not installed on many of the old distributions supported by GNU Parallel, whereas open3 is.

How can I wrap open3 so that I can capture file descriptors 3..61 in the same way I can capture STDOUT and STDERR?

Background

This is intended for a possible extension of GNU Parallel, so you can do:

# Currently mixes output due to fd 3 not buffered parallel 'echo {} start >&3;sleep 10;echo {} end >&3' ::: a b c 3> +out.file
without having the output from different jobs mixed. Right now only STDOUT and STDERR are buffered and thus guaranteed not to mix.
# This currently works parallel 'echo {} start >&2;sleep 10;echo {} end >&2' ::: a b c 2> +out.file