Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Re: system call not working

by graff (Chancellor)
on May 13, 2004 at 01:42 UTC ( [id://352960] : note . print w/replies, xml ) Need Help??


in reply to Re: system call not working
in thread system call not working

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.

Replies are listed 'Best First'.
Re: Re: Re: system call not working
by borisz (Canon) on May 13, 2004 at 08:30 UTC
    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