On Thu, Jul 2, 2009 at 04:36, Eric Veith<[email protected]> wrote:
>
> Hello List,
>
> as part of a Perl script of mine, I want to execute a program, get its
> return code AND capture its output on both STDERR and STDOUT. I tried
> IO::Handle, but that only gives me STDOUT and not the return code. Using
> qr//, I cannot read linewise and have to load the complete program's output
> into memory first, which I want to avoid. (Please feel free to correct me
> on anything of the above.)
>
> What I tried to archive now can be summarized in this little script:
>
> my $stdout = IO::File->new('stdout', 'w');
> my $stderr = IO::File->new('stderr', 'w');
>
> my $pid = fork();
> die("Could not fork, stopping") if(not defined $pid);
>
> if(0 == $pid) {
> *STDOUT = $stdout;
> *STDERR = $stderr;
> system("df", "-h");
> my $rc = $?;
> $stdout->flush(););
> exit($rc << 127););
> } else {
> print "Parent.\n";;
> wait();
> print "RC=$?\n";
> }
>
> $stdout->close();
> $stderr->close();
>
>
> That does not, however, work as expected. I do get STDERR's output (if I,
> for example, change the command in system() to something that does not
> work, e. g. system("df", "garbage", "-FOO"); the error is to be found in
> the stderr file), but not the output on STDOUT -- that is printed out on
> screen just as usual.
>
> What am I missing here? How can I do a fork, re-open STDOUT/STDERR to write
> to an instance of IO::Handle, and get the return code?
>
> Thanks for any hints.
>
> -- Eric
>
>
> --
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> http://learn.perl.org/
>
>
>
You need [IPC::Open3][1]. It allows you to run a command and capture
the STDOUT, STDERR, and (via the [$?][2] variable). Here is an
example:
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3;
#the program gets run by itself with an argument
if (@ARGV) {
print "this went to STDOUT\n";
print STDERR "this went to STDERR\n";
exit 55;
}
my $err = 1; #err handle must be true or it gets combined into out
my $pid = open3 my $in, my $out, $err, $^X, $0, 1
or die "could not run '$^X $0 1': $!";
waitpid $pid, 0; #wait for program to finish;
my $return_code = $? >> 8;
my $stdout = join "", <$out>;
my $stderr = join "", <$err>;
print "I saw $return_code as the return code\n",
"and [$stdout] on STDOUT and [$stderr] on STDERR.\n";
[1] : http://perldoc.perl.org/IPC/Open3.html
[2] : http://perldoc.perl.org/perlvar.html#$?
--
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/