Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^3: Capturing STDERR using IO::Handle

by educated_foo (Vicar)
on Nov 26, 2007 at 18:10 UTC ( [id://653051]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Capturing STDERR using IO::Handle
in thread Capturing STDERR using IO::Handle

Here is a script that saves, redirects, and restores STDOUT and STDERR using various methods:
#!/usr/bin/perl open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; open OLDERR, ">&", \*STDERR or die "Can't dup STDERR: $!"; open STDOUT, '>', "foo.out" or die "Can't redirect STDOUT: $!" +; open STDERR, ">&STDOUT" or die "Can't dup STDOUT: $!"; select STDERR; $| = 1; # make unbuffered select STDOUT; $| = 1; # make unbuffered print STDOUT "stdout 1\n"; # this works for print STDERR "stderr 1\n"; # subprocesses too open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!"; open STDERR, ">&OLDERR" or die "Can't dup OLDERR: $!"; print STDOUT "stdout 2\n"; print STDERR "stderr 2\n";
It would be straightforward to then slurp in the contents of the saved-off files. Or did I misunderstand the question?

Replies are listed 'Best First'.
Re^4: Capturing STDERR using IO::Handle
by xdg (Monsignor) on Nov 26, 2007 at 21:39 UTC

    Apart from the STDOUT typos above when redirecting STDERR, this approach is prone to dying if STDOUT or STDERR are already closed for some reason. Also, under wperl.exe on MSWin32, what you have may cause a segfault.

    IO::CaptureOutput can deal with those kinds of edge cases for you.

    Update: I misread the intent of the code example -- it's not a typo, it's merging STDERR and STDOUT intentionally.

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Re^4: Capturing STDERR using IO::Handle
by ikegami (Patriarch) on Nov 26, 2007 at 18:19 UTC
    Thanks. Yes, that would work. I didn't realize you were suggesting using temporary files. Seems like a lot of work that core function open3 (via IPC::Open3) already does for you (and it doesn't even require temporary files).
      Ah, right you are. But it's easy to screw yourself that way, since you're also blocking the child's STDIN and STDOUT.

        No harder than your method, since you can pass open file handles to open3 or open-style dup instructions.

        STDIN is moot. None of solutions pass anything to STDIN, since we weren't asked to pass anything to STDIN. You can close the child's STDIN if you want, or you can tie it to the parent's STDIN (by passing '<&STDIN') if you want.

        Similarly, you can do anything you want with the child's STDOUT. You can tie it to the parent's STDOUT ('>&STDOUT'), you can close it, you can redirect it to /dev/null, etc.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://653051]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (9)
As of 2024-03-29 15:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found