我正在尝试执行系统命令,例如
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提前。
答案 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";