'>pty>' means '&>pty>', not '1>pty>' The pseudo terminal redirects both stdout and stderr unless you specify a file descriptor. If you want to grab stderr separately, do this: start \@cmd, 'pty>', \$out, '2>', \$err ; #### use IPC::Run qw(run); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>pty>', sub { $out .= $_[0]; print STDOUT $_[0] }, '2>', sub { $err .= $_[0]; print STDERR $_[0] }, );