Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I run an external command and capture its output in Perl?

Tags:

I'm new to Perl and want to know of a way to run an external command (call it prg) in the following scenarios:

  1. Run prg, get its stdout only.
  2. Run prg, get its stderr only.
  3. Run prg, get its stdout and stderr, separately.
like image 444
gameover Avatar asked Mar 17 '10 10:03

gameover


People also ask

How do I get the output command in Perl?

In addition, if you just want to process a command's output and don't need to send that output directly to a file, you can establish a pipe between the command and your Perl script. use strict; use warnings; open(my $fh, '-|', 'powercfg -l') or die $!; while (my $line = <$fh>) { # Do stuff with each $line. }

How do you store the output of a command to a variable in Perl?

The easiest way is to use the `` feature in Perl. This will execute what is inside and return what was printed to stdout: my $pid = 5892; my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`; print "not = $var\n"; This should do it.

What is QX in Perl?

PERL QX FUNCTION. Description. This function is a alternative to using back-quotes to execute system commands. For example, qx ls − l will execute the UNIX ls command using the -l command-line option. You can actually use any set of delimiters, not just the parentheses.


2 Answers

You can use the backtics to execute your external program and capture its stdout and stderr.

By default the backticks discard the stderr and return only the stdout of the external program.So

$output = `cmd`; 

Will capture the stdout of the program cmd and discard stderr.

To capture only stderr you can use the shell's file descriptors as:

$output = `cmd 2>&1 1>/dev/null`; 

To capture both stdout and stderr you can do:

$output = `cmd 2>&1`; 

Using the above you'll not be able to differenciate stderr from stdout. To separte stdout from stderr can redirect both to a separate file and read the files:

`cmd 1>stdout.txt 2>stderr.txt`; 
like image 96
codaddict Avatar answered Sep 24 '22 01:09

codaddict


You can use IPC::Open3 or IPC::Run. Also, read How can I capture STDERR from an external command from perlfaq8.

like image 33
ghostdog74 Avatar answered Sep 25 '22 01:09

ghostdog74