Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re: Re: Re: Use of IPC::Run rather than system()

by gmarler (Sexton)
on Jul 16, 2003 at 18:01 UTC ( #274959=note: print w/replies, xml ) Need Help??

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

Thanks for that - note however that in addition to capturing STDOUT/STDERR, I still need to have the STDIN/STDOUT/STDERR of the external program connected to the terminal where the person is running the script, in case the external program requires input from the user, and so that any output is immediately visible to the user, in addition to being saved in the scalar(s).

I'll try your recommendation out though - maybe it does give me what I want.

  • Comment on Re: Re: Re: Use of IPC::Run rather than system()

Replies are listed 'Best First'.
Re^4: Use of IPC::Run rather than system()
by Aristotle (Chancellor) on Jul 16, 2003 at 18:33 UTC
    For STDIN/-ERR, just print the output to the appropriate handles yourself. For STDIN, if you have taken control of the subprocesses STDIN yourself, just copy the user input in there yourself. You can do that "realtime" rather than post mortem by passing closures rather scalar refs, if memory serves.

    Makeshifts last the longest.

      Something like this should work:
      use IPC::Run qw(run); my ($out, $err) = ('', ''); run(['/path/to/prog', @args], '>', sub { $out .= $_[0]; print $_[0] }, '2>', sub { $err .= $_[0]; print $_[0] });

      Ilya Martynov,
      CTO IPonWEB (UK) Ltd
      Quality Perl Programming and Unix Support UK managed @ offshore prices -
      Personal website -

        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>' );

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://274959]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2017-01-22 19:00 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (189 votes). Check out past polls.