用于捕获在后引号中执行的命令的stderr和stdout的Perl脚本

时间:2012-03-20 09:01:40

标签: linux perl

在我在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;
}

5 个答案:

答案 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)