Perl:获取系统调用的 STDERR,与 STDOUT 分开
Perl: Getting STDERR of system call, separately from STDOUT
我通常在 Perl 中获得一个包含 STDOUT 和 STDERR 的字符串就足够了。我是这样做的:
my $stdout_and_stderr = `$cmd 2>&1`;
但现在我需要在 2 个单独的字符串中使用它 - 一个用于 STDOUT,一个用于 STDERR。
如何在 Perl 中完成?
这是一个例子。
#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open3;
my $cmd = 'ls -la';
my $pid = open3(\*WRITER, \*READER, \*ERROR, $cmd);
#if \*ERROR is 0, stderr goes to stdout
while( my $output = <READER> )
{
print "output->$output";
}
while( my $errout = <ERROR> )
{
print "err->$errout";
}
waitpid( $pid, 0 ) or die "$!\n";
my $retval = $?;
print "retval-> $retval\n";
use IPC::Run3 qw( run3 );
run3 [ 'sh', '-c', $cmd ], undef, my $stdout, my $stderr;
实际上我找到了一种更简单的方法来只捕获 STDERR。捕获 STDERR 并丢弃 STDOUT:
$output = `cmd 2>&1 1>/dev/null`;
你也可以反其道而行之 - 扔掉 STDERR,这样它甚至不会打印到 shell:
$output = `cmd 2>/dev/null`;
如果您需要分别捕获它们,请使用此线程中的其他答案之一。他们很好
我通常在 Perl 中获得一个包含 STDOUT 和 STDERR 的字符串就足够了。我是这样做的:
my $stdout_and_stderr = `$cmd 2>&1`;
但现在我需要在 2 个单独的字符串中使用它 - 一个用于 STDOUT,一个用于 STDERR。
如何在 Perl 中完成?
这是一个例子。
#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open3;
my $cmd = 'ls -la';
my $pid = open3(\*WRITER, \*READER, \*ERROR, $cmd);
#if \*ERROR is 0, stderr goes to stdout
while( my $output = <READER> )
{
print "output->$output";
}
while( my $errout = <ERROR> )
{
print "err->$errout";
}
waitpid( $pid, 0 ) or die "$!\n";
my $retval = $?;
print "retval-> $retval\n";
use IPC::Run3 qw( run3 );
run3 [ 'sh', '-c', $cmd ], undef, my $stdout, my $stderr;
实际上我找到了一种更简单的方法来只捕获 STDERR。捕获 STDERR 并丢弃 STDOUT:
$output = `cmd 2>&1 1>/dev/null`;
你也可以反其道而行之 - 扔掉 STDERR,这样它甚至不会打印到 shell:
$output = `cmd 2>/dev/null`;
如果您需要分别捕获它们,请使用此线程中的其他答案之一。他们很好