Perl 如何抑制或重定向到系统命令的变量输出

Perl 如何抑制或重定向到系统命令的变量输出,perl,unit-testing,stderr,Perl,Unit Testing,Stderr,例如,我正在尝试执行系统命令 system('git clone .....' ); if ($?) { croak('Error while cloning git repository'); } 这里我检查结果是否成功,但如何不从系统命令输出错误,例如在我的例子中,我可以得到如下结果 Permission denied (publickey). fatal: Could not read from remote repository. Please ma

例如,我正在尝试执行系统命令

 system('git clone .....' );
    if ($?) {
        croak('Error while cloning git repository');
    }
这里我检查结果是否成功,但如何不从系统命令输出错误,例如在我的例子中,我可以得到如下结果

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
来自已执行的命令。
我需要将此错误输入变量并抑制它(不要将其打印到终端)
然后检查此错误消息。
或者至少压制它。
我需要用以下方法测试这样的子程序

dies_ok { MyModule::sub_uses_system_command() } 'Died :(';
有可能得到这样的结果吗?

Thx提前。

使用
qx
捕获命令的输出,而不是
system
。看起来您还想捕获stderr,所以使用标准的
2>&1
将stderr复制到stdout

 $var = qx( git clone ... 2>&1 )

使用
qx
捕获命令的输出,而不是
system
。看起来您还想捕获stderr,所以使用标准的
2>&1
将stderr复制到stdout

 $var = qx( git clone ... 2>&1 )
仅返回已执行程序的退出状态,如果要获得标准输出,可以使用或反勾号执行命令:

my $result = `git clone [...] 2>&1`
您应该注意,执行命令的
qx/command/
和backticks形式只返回STDOUT,因此如果要捕获STDERR,需要在命令中将STDERR重定向到STDOUT。

只返回已执行程序的退出状态,如果要获得标准输出,可以使用或反勾号执行命令:

my $result = `git clone [...] 2>&1`

您应该注意,执行命令的
qx/command/
和backticks表单只返回STDOUT,因此如果您想要捕获STDERR,您需要在命令中将STDERR重定向到STDOUT。

如果您需要执行多个输出到STDERR/STDOUT的测试,您可以在一个块中重定向它们并在其中运行所有这些测试。这里有一个基本的例子

sub use_system {
    system("asdfasdf asdfasdf");
    croak('this error') if $?;
}

{
    open my $stderr, '>', 'temp.fil' or die $!;
    local *STDERR = $stderr;

    dies_ok { use_system() } 'Died :(';

    # or even

    eval { use_system(); };

    like ($@, qr/this error/, "function failed with 'this error'");
}

warn "STDERR back to normal\n";

如果需要执行多个输出到STDERR/STDOUT的测试,可以在一个块中重定向它们,并在其中运行所有这些测试。这里有一个基本的例子

sub use_system {
    system("asdfasdf asdfasdf");
    croak('this error') if $?;
}

{
    open my $stderr, '>', 'temp.fil' or die $!;
    local *STDERR = $stderr;

    dies_ok { use_system() } 'Died :(';

    # or even

    eval { use_system(); };

    like ($@, qr/this error/, "function failed with 'this error'");
}

warn "STDERR back to normal\n";
另请参见单独捕获STDERR。另请参见单独捕获STDERR。。