in reply to Re: Can't close STDIN/STDOUT/STDERR
in thread Can't close STDIN/STDOUT/STDERR

Ah! It appears to originate from Net::OpenSSH. (Thanks Google)

Anyway, it's a fair warning. Programs expect to be provided a STDIN, STDOUT and STDERR, and you don't provide them. Don't close them. Instead, redirect them to /dev/null.

Replies are listed 'Best First'.
Re^3: Can't close STDIN/STDOUT/STDERR
by brp4h (Acolyte) on Feb 09, 2010 at 21:20 UTC
    I tried that (redirect to /dev/null) and it broke my program... I'm not well-versed enough in Perl to know why. Could you give me an example of how I should do it?
      You can find samples of how to redirect file handles in open:

      open STDOUT, '>', "/dev/null" or die "Can't redirect STDOUT: $!";

      close(READER) or die "can't close READER: $!"; open STDIN, '<', '/dev/null' or die "can't open STDIN: $!\n"; open STDOUT, '>', '/dev/null' or die "can't open STDOUT: $!\n"; open STDERR, '>&', \*STDOUT' or die "can't dup STDOUT: $!\n";

        What does this syntax do:

        open STDERR, '>&', \*STDOUT'

        because this simpler syntax seems to work:

        1 use strict; 2 use warnings; 3 use 5.010; 4 5 open my $SAVE_STDOUT, '>&', 'STDOUT'; #<--quoted bareword 6 open STDOUT, '>', 'data1.txt'; 7 say 'hello world'; 8 9 open my $SAVE_STDERR, '>&', 'STDERR'; #<--quoted bareword 10 open STDERR, '>', 'errors.txt'; 11 warn "my warning message"; 12 13 open STDOUT, '>&', $SAVE_STDOUT; 14 open STDERR, '>&', $SAVE_STDERR; 15 say 'goodbye'; 16 warn 'my warning message #2'; --output:-- goodbye my warning message #2 at 2perl.pl line 16. $cat data1.txt hello world $cat errors.txt my warning message at 2perl.pl line 11.
        EDIT: In fact, I just tried using STDOUT and STDERR as the third argument to open() without quotes around them, and that works too: the output is the same.