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.
| [reply] [d/l] [select] |
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?
| [reply] [d/l] |
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.
| [reply] |
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).
| [reply] [d/l] |