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


in reply to Re: Re^4: Use of IPC::Run rather than system()
in thread Use of IPC::Run rather than system()

This seems to have worked the best of all, after I turned off buffering for STDOUT/STDERR, with code such as this:

my ($ofh) = select(STDOUT); $| = 1; select($ofh); $ofh = select(STDERR); $| = 1; select($ofh); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>', sub { $out .= $_[0]; print $_[0] }, '2>', sub { $err .= $_[0]; print $_[0] }, );

Now, if the program I was running demands that it connects to a pty before it will unbuffer STDOUT/STDERR properly, what could I do? I've tried the following, but it doesn't send any output to the screen:

use IPC::Run qw(run); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>', sub { $out .= $_[0]; print $_[0] }, '>', '>pty>', '2>', sub { $err .= $_[0]; print $_[0] }, '2>', '>pty>' );

Replies are listed 'Best First'.
Re: Re: Re: Re^4: Use of IPC::Run rather than system()
by IlyaM (Parson) on Jul 17, 2003 at 07:18 UTC

    I'm not sure it is correct syntax. From IPC::Run docs:

    '>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<', \$in, '>pty>', \$out, '2>', \$err +;

    So probably your code should look like (untested):

    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] }, );

    --
    Ilya Martynov, ilya@iponweb.net
    CTO IPonWEB (UK) Ltd
    Quality Perl Programming and Unix Support UK managed @ offshore prices - http://www.iponweb.net
    Personal website - http://martynov.org