views:

244

answers:

3

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.
+6  A: 

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`;
codaddict
Another way to read stdout and stderr separately, without using temporary files, is to use IPC::Open3.
Dave Hinton
Every time backticks are used, a kitten dies. In shell, use $(). In perl, use qx.
William Pursell
+3  A: 

You can use qx/STRING/(or backticks). See Quote-Like Operators in perlop.

eugene y
+8  A: 

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

ghostdog74
Please don't link to anything that has "oldfaq" in the URL. :)
brian d foy