Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Run multiple shell commands on the same perl script

by Daral (Initiate)
on Oct 30, 2012 at 22:24 UTC ( #1001568=perlquestion: print w/ replies, xml ) Need Help??
Daral has asked for the wisdom of the Perl Monks concerning the following question:

Hello, Im trying to run multiple shell commands on the same perl script, Could you please help me to know how. When I run the script below, it only picks the first commands. Thanks for your time and your help. example.pl use strict; my $ls =exec ("ls"); my $con = exec("ifconfig");

Comment on Run multiple shell commands on the same perl script
Re: Run multiple shell commands on the same perl script
by 2teez (Priest) on Oct 30, 2012 at 22:42 UTC

    You can do like so:

    use warnings; use strict; for my $cmd(qw(ls ipconfig)){ system("$cmd"); }
    NOTE:
    1. Please, check this How do I post a question effectively?

    2. "..When I run the script below, it only picks the first commands.."
    3. Reason and Answer:
      "..The "exec" function executes a system command *and never returns*; use "system" instead of "exec" if you want it to return...."
      Check also exec and system
    4. I used ipconfig instead of the OP ifconfig because I tested this on window OS.
    Hope this helps.

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me
Re: Run multiple shell commands on the same perl script
by Athanasius (Monsignor) on Oct 31, 2012 at 02:20 UTC

    Hello Daral, and welcome to the Monastery!

    As 2teez explained, you can use system to run an external command from within a Perl script. But note that system returns the command’s exit status, not its output. If you want to capture the command’s output, use backticks (or the equivalent qx operator):

    #! perl use strict; use warnings; my $ls = `ls`; print "Output from ls:\n\n", $ls, "\n"; my $con = `ipconfig`; print "Output from ipconfig:\n\n", $con, "\n";

    Update: To capture both the output and the exit status, use the CPAN module Capture::Tiny.

    Hope that helps,

    Athanasius <°(((><contra mundum

      $? returns the result code from the last system() call or backtick operation, I believe, so you can both capture output and process result codes.

      Example:

      #!/bin/perl # first command deliberately generates an error.... print `rubbish`; print "Rubbish Result: $?\n"; # this command should succeed print "ls Output:\n"; print `ls -l`; print "ls Result: $?\n";
      Output:
      Rubbish Result: -1 ls Output: total 10 -rw-r--r-- 1 Userid Domain Users 1242 Oct 30 10:04 1.txt -rw-r--r-- 1 Userid Domain Users 1531 Oct 30 10:04 2.txt -rwxr-xr-x 1 Userid Domain Users 351 Oct 30 10:48 test.pl -rwxr-xr-x 1 Userid Domain Users 108 Oct 31 14:21 var.pl ls Result: 0
      Note the first output of $? is -1 (an error), whilst the second is 0 (success)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2014-09-20 16:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (160 votes), past polls