Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Capturing STDERR using IO::Handle

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


in reply to Capturing STDERR using IO::Handle

Perlfunc has an example that does exactly what you want under open.

Replies are listed 'Best First'.
Re^2: Capturing STDERR using IO::Handle
by ikegami (Patriarch) on Nov 26, 2007 at 17:14 UTC

    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.

      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).

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (4)
As of 2024-04-19 21:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found