Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
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 (Prior) 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 studying the Monastery: (3)
As of 2014-07-13 01:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (244 votes), past polls