Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: system call not working

by borisz (Canon)
on May 12, 2004 at 16:00 UTC ( [id://352813] : note . print w/replies, xml ) Need Help??


in reply to system call not working

try
system('procheck', $pdbfile, '1.0') == 0 or die "system failed ( $? )" +;
try the full path too. Perhaps you bypass your .bashrc
Boris

Replies are listed 'Best First'.
Re: Re: system call not working
by graff (Chancellor) on May 13, 2004 at 01:42 UTC
    The multi-arg usage of system() is good -- somebody needed to point that out (and I'll explain it for the OP).

    But the "or die" part is wrong: system() will return the exit status of the process, which is based on shell semantics: a return value of zero means "success" (i.e. "good") whereas any non-zero value means "failure" (i.e. "bad") -- so you probably want to say "and die" instead. But that's confusing, so it's usually better to say it like this:

    my $err_stat = system( $prog, @args ); die "system failed on $prog @args: $?" if $err_stat;
    (update: my apologies -- I missed the "== 0" part in borisz's post.)

    As to the reason for the multi-arg usage, the difference between this:

    system( "$prog @args" );
    and this:
    system( $prog, @args );
    can be demonstrated harmlessly if $prog is set to something like "cat" and any element of @args is set to something like "\$HOME/.bashrc; echo I could delete everything right now".

    In the multi-arg usage (the latter choice), each element of @args is passed directly to the "argv" array of "cat" -- if an arg does not map to a readable file name, cat reports an error. In the single-string command-line case, the whole string is passed to a shell, and the shell executes the string. If the string happens to contain workable instructions that you don't expect or don't want, you could be in for a nasty surprise.

      Hi,
      But the "or die" part is wrong: system() will return the exit status of the process, which is based on shell semantics: a return value of zero means "success" (i.e. "good") whereas any non-zero value means "failure" (i.e. "bad") -- so you probably want to say "and die" instead.
      You are wrong, the example is fine.
      system('procheck', $pdbfile, '1.0') == 0 or die "system failed ( $? )" +;
      die is only called, if the returncode from system is not 0. This is exactly what we want it to do.
      Boris