Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

system call not working

by Melanie (Acolyte)
on May 12, 2004 at 15:50 UTC ( [id://352803]=perlquestion: print w/replies, xml ) Need Help??

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

Hi there
I am trying to call an external program using a perl script but it doesnt work. Other calls to other programs work fine. When I print out the 'call' and just run it from the command line thr program runs just fine. The path to the program is also definately in my .bashrc file so I shouldnt need the full path etc.
Here is the code
#!/usr/bin/perl $pdbfile = $ARGV[0]; system("procheck $pdbfile 1.0");
Any suggestions would be much appreciated.
Mel

Replies are listed 'Best First'.
Re: system call not working
by borisz (Canon) on May 12, 2004 at 16:00 UTC
    try
    system('procheck', $pdbfile, '1.0') == 0 or die "system failed ( $? )" +;
    try the full path too. Perhaps you bypass your .bashrc
    Boris
      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
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

      But if you always run your Perl script from an interactive shell, then it inherits those environment variables.
        You're assuming that environment variables are involved. Maybe it's a shell alias.

            -- Chip Salzenberg, Free-Floating Agent of Chaos

Re: system call not working
by pbeckingham (Parson) on May 12, 2004 at 15:54 UTC

    Try using the full path to the procheck program. Your bash profile is not going to help you here.

      Hi there
      I did try the full path. No go Im afraid. But thanks for the thought :)
      Mel

        Please do the following:

        #!/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?

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).

    1. The program 'procheck' requires the absolute path to the 'pdbfile'.
    2. 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,
    Kristofer A. Hoch
    Quality Assurance Professional
    kristoferhoch@yahoo.com
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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://352803]
Approved by Paladin
Front-paged by pbeckingham
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (8)
As of 2024-04-24 10:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found