Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: best practices for checking system return values for piped commands?

by Anonymous Monk
on May 02, 2006 at 01:35 UTC ( #546798=note: print w/ replies, xml ) Need Help??


in reply to best practices for checking system return values for piped commands?

Note that bash also has a PIPESTATUS (sp?) env var array that allows you to get the "$?" of the intermediate commands in the pipeline.


Comment on Re: best practices for checking system return values for piped commands?
Re^2: best practices for checking system return values for piped commands?
by eXile (Priest) on May 02, 2006 at 02:41 UTC
    I second the use of bash-es PIPESTATUS, I've used it in code like this:
    my %cmds = ( 'bash' => '/usr/local/bin/bash',
                 'gzip' => '/usr/bin/gzip',
                 'lzop' => '/usr/bin/lzop',
                 'wc'   => '/usr/bin/wc' );
    
    
    my @zip_results = `$cmds{'bash'} -c '$cmds{$compress} -dc $file | $cmds{'wc'} -c ; echo \${PIPESTATUS\@}'`;
    
    The last line of @zip_results has the status of both the 'compress' command and the 'wc' command.
      I'm struggling with trying to identify a failure in a set of piped commands run on a remote host via ssh. I use perl to build and run the command line as below
      ssh $TARGET_HOST "sudo find $TARGET_DIR -name \'$TARGET_FILE\' | sudo +cpio --create --format ustar" | bzip2 -9 -c
      Initially I just redirected the output to a file, which is fine if both the $TARGET_DIR and $TARGET_FILE exists. However, if one or both do not exist, then I still get a file created, but it's empty.
      Things I've tried:
      With $ret=system($cmd); and testing the the value of $ret:
    • Pre-fixing the cmd with set -o pipefail && .
    • Adding set -o pipefail to the command run by ssh.
    • Adding set -o pipefail to the command run by sudo.
    • Doing the bzip2 locally.
      With @results = `$cmd`, and testing the value of $?:
    • Adding ; echo \${PIPESTATUS\@}; to the end of $cmd, within the string passed to ssh.
    • Adding ; echo \${PIPESTATUS\@}; to the end of $cmd, after the string passed to ssh.
      Using the @results approach, I only get one entry, so I suspect that the backtick method only sees one stream?

      Any ideas on how I can detect the remote pipeline failure?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://546798]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (9)
As of 2014-12-23 02:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (133 votes), past polls