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

I'm trying unsuccessfully to pipe out the STDOUT of a command should it fail. Here's what I have so far (ERROR is a file handle):
system ("sc \\\\${hostname} stop SNMP") or print ERROR warn "Couldn\'t + stop the SNMP service,";
I want to capture the error (should it fail) and parse to a debug file.

Replies are listed 'Best First'.
Re: Piping STDOUT
by metadatum (Scribe) on Oct 02, 2002 at 13:40 UTC
    don't use system, use backticks

    $output = `sc \\\\$(hostname) stop SNMP`

    $output will contain the results from STDOUT, for both success and failure.

      Also, this will capture both STDOUT and STDERR:

      $output = `sc \\\\$(hostname) stop SNMP 2>&1`

      note: works in Linux/Unix systems

        The above works, good thing I re-checked before posting, here is a node that has quite a few links on this subject:
        Catching STDERR with open (
        Just in case you need more ways to do it.
Re: Piping STDOUT
by rir (Vicar) on Oct 02, 2002 at 13:52 UTC
    Try something like:
    open RPIPE, "sc \\\\${hostname} stop SNMP |") or die "No trenching tools!";
Re: Piping STDOUT
by antifun (Sexton) on Oct 02, 2002 at 22:16 UTC
    Just for completeness in tearing your question apart :) -- 'warn' will output to STDERR, and if you use "" to surround the string you don't need to escape the '. Just say
    @err = `sc \\\\${hostname} stop SNMP 2>&1` or warn "Couldn't stop the +SNMP service,";
    Now, is that what you want? The above will warn you if the command doesn't say anything on either stdout or stderr -- which in most cases means nothing was wrong. If it's the opposite behavior you want (warn if something _was_ output), s/and/or/. If you just want to catch stderr and throw stdout away, the simplest thing to do is to futz with the shell redirection inside the `` like so (remember it's going to be sh even if you choose to afflict yourself with (t)csh interactively):
    @err = `sc \\\\${hostname} stop SNMP 2>&1 >/dev/null` or warn "Couldn' +t stop the SNMP service,";
    ---
    "I hate it when I think myself into a corner."
    Matt Mitchell