Simpler, clearer, more self-contained test:
#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open3;
use Test::More tests => 1;
# Hide undesired output.
open(STDOUT, '>', '/dev/nul');
open(STDERR, '>', '/dev/nul');
# Associate STDOUT and STDERR with
# descriptors other than 1 and 2.
open(local *STDOUT, '>', '/dev/nul');
open(local *STDERR, '>', '/dev/nul');
open3(
undef,
local *PIPE,
undef,
'echo out ; echo err >&2',
);
my $pipe = '';
$pipe .= $_ while <PIPE>;
is($pipe, "out\nerr\n");
Still unix-specific, though.