s_gaurav1091 has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I am struck up at a problem. I want to write a script in which I dont any error to be shown on the console.Pls look at the code for refrence.
my $rc = system("java -version 2>/dev/null"); print "$rc\n";
Now when I am running the srcipt and in case the error comes I want only $rc should be printed on screen. But the output is coming like UX:sh (sh): ERROR: java: Not found rc is 256 Can anyone pls sugget as how to hide this error.Thanx in advance

Replies are listed 'Best First'.
Re: redirecting standard output and standard error
by Skeeve (Parson) on Sep 04, 2006 at 13:55 UTC
    open(STDERR, '>', '/dev/null'); system("/i/dont/exist")

    s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
    +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
Re: redirecting standard output and standard error
by shmem (Chancellor) on Sep 04, 2006 at 12:55 UTC
    my $rc = system("java -version >/dev/null 2>&1");
    might do on UNIX/Linux (redirect STDOUT to /dev/null, redirect STDERR to STDOUT closing the STDERR filehandle).

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
Re: redirecting standard output and standard error
by holli (Abbot) on Sep 04, 2006 at 13:21 UTC
    IPC::Open2, IPC::Open3.
    Though I'm still not sure what is the real difference between the two (despite some syntax stuff).


    holli, /regexed monk/
      Though I'm still not sure what is the real difference between the two (despite some syntax stuff).
      • Open2 - STDIN, STDOUT
      • Open3 - STDIN, STDOUT & STDERR

      Although I would personally use IPC::Run3 module which has a much simpler API in my opinion.

Re: redirecting standard output and standard error
by graff (Chancellor) on Sep 04, 2006 at 15:06 UTC
    Skeeve has shown how to get rid of the stderr output from the system call.

    The error message is saying that when "system()" invokes a shell to run your "java -version" command, the shell is unable to find an application called "java" in its current PATH. But I don't understand the "UX:" part.

    What operating system and shell are you using? This might account for why the redirection didn't work as expected. On my bsd-based darwin OS, the first of the two commands below produces an error message on the console, but the second does not -- meanwhile, a freebsd system behaves differently:

    perl -e 'system( "foo > junk" ); # prints: # sh: line 1: foo: command not found (on darwin) # foo: not found (on freebsd 6.1) perl -e 'system( "foo > junk 2>/dev/null" ); # no output on darwin # still prints "foo: not found" on freebsd
    I'm not sure if that's a difference in how Perl was built on the two machines I happened to be using, or whether it's a matter of how the shells work.

    It may also be relevant that the ability to redirect stderr and stdout separately is only available for Bourne-style shells (sh, bash, ksh, zsh); in "c-style" shells ("csh" and any others like it), you can redirect stdout, and you can have stderr included with stdout when redirecting stdout, and that's all you can do ( 2> errlog is not supported, which is a big reason why I never use csh).

      I guess system("something 2>/dev/null") should redirect the error output of "something". Not that of the shell calling "something" So I would expect the error to be displayed when "something" isn't available (the error is produced by the shell) and to be suppressed when "something" is available, but produces an error.

      s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
      +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
Re: redirecting standard output and standard error
by OfficeLinebacker (Chaplain) on Sep 04, 2006 at 19:41 UTC
    IPC::Run is the way to go IMO.

    _________________________________________________________________________________

    I like computer programming because it's like Legos for the mind.