in reply to Using warn() when STDERR is closed

You should never close STDERR. This first time your program tries to print to it, it can't, which creates another error, which it can't print, which creates another error, ...

Try this instead:

use File::Spec; open STDERR, '>', File::Spec->devnull() or exit( 1 );

Replies are listed 'Best First'.
Re^2: Using warn() when STDERR is closed
by derby (Abbot) on Jul 15, 2010 at 16:46 UTC

    Or more commonly, redirect at the shell:

    perl -le 'open AA, ">test.txt"; warn "Hello"; print AA "foo\n";' 2> +/dev/null

    -derby

      Not everyone runs Linux.

      It's a sad, sad world we live in. :(

        What is the relation of I/O redirection from a shell to Linux? I/O redirection is a shell feature, not a Linux feature. In this form, it is at least available on EVERY Unix derivate, on any Windows version derived from NT, on OS/2, and, to a lesser extend (no redirection of STDERR), on DOS and any Windows version derived from Windows 95.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
Re^2: Using warn() when STDERR is closed (wrong why)
by tye (Sage) on Jul 17, 2010 at 18:12 UTC
    This first time your program tries to print to it, it can't, which creates another error, which it can't print, which creates another error, ...

    So, closing STDERR will lead to an infinite loop if an error occurs. As is easily demonstrated:

    % perl close STDERR; die "ZOMG, infinite loop!"; __END__ %

    Or not. :)

    Actually, writing to a closed file handle doesn't generate an error in most situations:

    % perl close STDOUT; print "Generate error!\n"; __END__ %

    If you enable warnings and use Perl code to write to a closed file handle, then you do generate a warning:

    % perl -w close STDOUT; print "Generate error!\n"; __END__ print() on closed filehandle STDOUT at - line 2. %

    But the code that puts out that warning isn't Perl code and so doesn't generate a warning if the handle that it is writing to is closed. So not even the following causes an infinite loop:

    % perl -w close STDOUT; close STDERR; print "Generate error!\n"; __END__ %

    I can even go rather far trying to facilitate an infinite loop without causing one:

    % perl -w my $loop; $SIG{__WARN__}= $loop= sub { $SIG{__WARN__}= $loop; print STDERR "Got: ", @_; print "Warn: ", @_; }; close STDOUT; print "Generate warning!\n"; die "Done.\n"; __END__ Got: print() on closed filehandle STDOUT at - line 7. print() on closed filehandle STDOUT at - line 4. Done. %

    But, yes, close()ing STDERR is indeed a bad idea (for other reasons, which I covered in another reply).

    - tye