Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^2: Capturing STDERR using IO::Handle

by ikegami (Patriarch)
on Nov 26, 2007 at 17:14 UTC ( [id://653036]=note: print w/replies, xml ) Need Help??


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

I don't see anything of the kind. Could you be more specific, please?

Remember tie(*HANDLE, ...) and open(..., \$var) don't produce system file handles, so they can't be inherited by child processes.

Replies are listed 'Best First'.
Re^3: Capturing STDERR using IO::Handle
by educated_foo (Vicar) on Nov 26, 2007 at 18:10 UTC
    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?

      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.

      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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (7)
As of 2024-04-19 09:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found