Re: system call not working
by borisz (Canon) on May 12, 2004 at 16:00 UTC
|
system('procheck', $pdbfile, '1.0') == 0 or die "system failed ( $? )"
+;
try the full path too. Perhaps you bypass your .bashrc
| [reply] [d/l] |
|
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. | [reply] [d/l] [select] |
|
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.
| [reply] [d/l] |
Re: system call not working
by chip (Curate) on May 12, 2004 at 16:58 UTC
|
"The path to the program is also definately in my .bashrc file"? What do you mean? And more to the point, why should that matter? After all, .bashrc is only sourced for interactive shells, and even if your system() call were using a shell, it wouldn't be an interactive one.
-- Chip Salzenberg, Free-Floating Agent of Chaos
| [reply] |
|
But if you always run your Perl script from an interactive shell, then it inherits those environment variables.
| [reply] |
|
You're assuming that environment variables are involved. Maybe it's a shell alias.
-- Chip Salzenberg, Free-Floating Agent of Chaos
| [reply] |
Re: system call not working
by pbeckingham (Parson) on May 12, 2004 at 15:54 UTC
|
| [reply] [d/l] |
|
Hi there
I did try the full path. No go Im afraid. But thanks for the thought :)
Mel
| [reply] |
|
#!/usr/bin/perl
$pdbfile = $ARGV[0];
print "path=$ENV{PATH}\n";
print "procheck $pdbfile 1.0\n";
#system("procheck $pdbfile 1.0");
Does $pdbfile contain the value you expect?
Does the path contain the location of procheck?
Are there any spaces in the value of $pdbfile?
| [reply] [d/l] [select] |
Re: system call not working
by krisahoch (Deacon) on May 13, 2004 at 04:52 UTC
|
Mel,
First, a disclaimer. This thought is based on the idea that the procheck program is looking for a file ($pdbfile).
- The program 'procheck' requires the absolute path to the 'pdbfile'.
- The procheck program may need the relative path of the pdbfile from its location
Are there anymore adjectives that you can use to tell us how 'it doesnt work'?
Thanks,
| [reply] |
Re: system call not working
by trammell (Priest) on May 13, 2004 at 15:31 UTC
|
One potential problem is that if $ARGV[0] contains whitespace, your system() call will be hosed. May not be your problem this time, but it could be in the future. | [reply] [d/l] |