在我在Perl脚本中执行的以下命令中,如何捕获stderr?
my $output = `ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/`;
if ($? ne '0')
{
$stderr = $output;
print $stderr;
}
else
{
$stdout = $output;
print $stdout;
}
答案 0 :(得分:6)
my $output = `ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/ 2>&1`;
最后的2>&1
将标准错误发送到与标准输出相同的位置,由后引号捕获。
答案 1 :(得分:5)
您可以使用Capture::Tiny捕获stdout,stderr或两者合并。
答案 2 :(得分:3)
我个人是核心模块IPC::Open3的粉丝,虽然2>& 1的答案会在同一个流中获得stderr和stdout(通常足够好)。以下内容将使它们分开。 但是,低级解决方案较少。
use IPC::Open3
my $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, qw(ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/));
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
if (child_exit_status != 0)
{
my $stderr = do { local $/; <CHLD_ERR> };
print "Failed command because: $stderr\n";
}
my $stderr = do { local $/; <CHLD_OUT> };
print "command stdout: $stdout\n";
答案 3 :(得分:3)
use IPC::Run;
my $rcode = run [ "ssh", "login.com", "git", ... ],
undef, \my $stdout, \my $stderr;
if ($rcode) {
print $stderr, "\n";
}
答案 4 :(得分:1)