I'm new to Perl and want to know of a way to run an external command (call it prg
) in the following scenarios:
prg
, get its stdout
only.prg
, get its stderr
only.prg
, get its stdout
and stderr
, separately.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. }
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.
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.
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`;
You can use IPC::Open3 or IPC::Run. Also, read How can I capture STDERR from an external command from perlfaq8.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With