If STDERR is tied and does not implement a real filehandle, especially if FILENO is not implemented, then running IPC::Run with redirection fails. Here's a sample script which fails with the error message "Can't locate object method "FILENO" via package "MySTDERR" at /opt/perl-5.18.4/lib/site_perl/5.18.4/IPC/Run.pm line 1126.":
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Run qw(run);
#{ no warnings 'redefine'; *IPC::Run::_debug_fd = sub { }; }
{
package MySTDERR;
use Symbol qw(geniosym);
sub TIEHANDLE { return bless geniosym, __PACKAGE__ }
sub PRINT { shift; print @_ }
}
tie *STDERR, 'MySTDERR' or die $!;
my $out;
run ["echo", "hello"], ">", \$out;
print "out is $out\n";
__END__
If IPC::Run's _debug_fd method is made into a no-op (see the commented out line), then operation is successful.
Probably the correct solution would be to check if the fileno() call is possible in _debug_fd() (using eval{} or ->can()), and just return undef otherwise.
From toddr@cpan.org on 2016-04-12 23:53:38:
perl recently (5.18?) made fileno get angry if a file handle wasn't open and fileno is called.
Migrated from rt.cpan.org#102824 (status was 'open')
Requestors:
From srezic@cpan.org on 2015-03-17 13:56:24:
If STDERR is tied and does not implement a real filehandle, especially if FILENO is not implemented, then running IPC::Run with redirection fails. Here's a sample script which fails with the error message "Can't locate object method "FILENO" via package "MySTDERR" at /opt/perl-5.18.4/lib/site_perl/5.18.4/IPC/Run.pm line 1126.":
If IPC::Run's _debug_fd method is made into a no-op (see the commented out line), then operation is successful.
Probably the correct solution would be to check if the fileno() call is possible in _debug_fd() (using eval{} or ->can()), and just return undef otherwise.
From toddr@cpan.org on 2016-04-12 23:53:38:
perl recently (5.18?) made fileno get angry if a file handle wasn't open and fileno is called.