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

perl, stderr, stdout

Solution

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`;

Problem

I'm new to Perl and want to know of a way to run an external command (call it `prg`) in the following scenarios: - Run `prg`, get its `stdout` only. - Run `prg`, get its `stderr` only. - Run `prg`, get its `stdout` and `stderr`, separately.

Original source

Related problems