Я хочу прочитать вывод команды в том числе STDERR в HANDLE:
open(HANDLE, "-|", $cmd, @args);
Но вышеприведенная команда просто читает стандартный ввод?
Как я могу прочитать stderr?
Я хочу прочитать вывод команды в том числе STDERR в HANDLE:
open(HANDLE, "-|", $cmd, @args);
Но вышеприведенная команда просто читает стандартный ввод?
Как я могу прочитать stderr?
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>)
цикле ,
или 'run [$ cmd, @args], '>', \ my $ stdout, '2>', \ my $ stderr;' – ikegami
Я использую Bash перенаправлением, как показано ниже в моем PERL код:
open (CMDOUT, "df -h 2>&1 |");
Это не достаточно хорошо, как цитирование всей команды в виде строки, позволяющей вам атаковать инъекциями. – DVK
Вы хотите посмотреть на IPC::Open3, который запускает процесс и предоставляет отдельные файлы для записи для ребенка и чтения STDOUT и STDERR для детей.
Вы хотите превратить 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
Да в одну файловую дескриптор – JMW
@amon - это должен быть ответ :) – DVK