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

时间:2015-08-05 19:28:30

标签: 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 make sure you have the correct access rights
and the repository exists.

从执行的命令。
我需要将此错误输入变量并禁止它(不要将其打印到终端)
而不是检查此错误消息 或至少只是压制它 我需要以下列方式测试这样的子程序

dies_ok { MyModule::sub_uses_system_command() } 'Died :(';

是否有可能得到这样的结果?
Thx提前。

3 个答案:

答案 0 :(得分:3)

system仅返回已执行程序的退出状态,如果要获取标准输出,可以使用qx/command/或反引号来执行命令:

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

您应该注意执行命令的qx/command/和反引号形式仅返回STDOUT,因此如果要捕获STDERR,则需要在命令中将STDERR重定向到STDOUT。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如果您需要进行多次输出到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";