2013-06-14 1 views
4

Я хочу прочитать вывод команды в том числе STDERR в HANDLE:

open(HANDLE, "-|", $cmd, @args); 

Но вышеприведенная команда просто читает стандартный ввод?

Как я могу прочитать stderr?

+8

Вы хотите превратить STDERR и STDOUT в один дескриптор файла? В этом случае вы сможете использовать операторы перенаправления оболочки + [ShellQuote] (https://metacpan.org/module/ROSCH/String-ShellQuote-1.04/ShellQuote.pm). В противном случае вам понадобится что-то вроде [IPC :: Run] (https://metacpan.org/module/TODDR/IPC-Run-0.92/lib/IPC/Run.pm) или [IPC :: Open3] (https : //metacpan.org/module/RJBS/perl-5.18.0/ext/IPC-Open3/lib/IPC/Open3.pm) – amon

+0

Да в одну файловую дескриптор – JMW

+2

@amon - это должен быть ответ :) – DVK

ответ

2

IPC::Run Модуль обеспечивает run функцию, которая работает как с наддувом system. Это позволяет собрать вывод STDERR и STDOUT в сочетании:

run [$cmd, @args], '&>', \my $output; 

после того, переменная $output имеет комбинированный выход в виде строки.

Пример:

use IPC::Run qw/ run /; 
run ['perl', '-E say "stdout"; say STDERR "stderr"'], '&>', \my $output; 
print uc $output; 

Выход:

STDOUT 
STDERR 

Я не знаю, как использовать дескриптор файла вместо скалярного ссылки, так что выход может быть прочитан обычно в while(<$fh>) цикле ,

+0

или 'run [$ cmd, @args], '>', \ my $ stdout, '2>', \ my $ stderr;' – ikegami

-1

Я использую Bash перенаправлением, как показано ниже в моем PERL код:

open (CMDOUT, "df -h 2>&1 |"); 
+1

Это не достаточно хорошо, как цитирование всей команды в виде строки, позволяющей вам атаковать инъекциями. – DVK

0

Вы хотите посмотреть на IPC::Open3, который запускает процесс и предоставляет отдельные файлы для записи для ребенка и чтения STDOUT и STDERR для детей.