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