使用perl中的bactticks将外部命令的输出存储到变量中

时间:2015-01-25 09:40:05

标签: perl

我正在使用以下代码将外部命令的输出存储在变量中。但是当我打印错误时,我什么都没得到。

$error1 = `hadoop fs -copyFromLocal $src_dir $tgt_dir`;
print "$error1\n";  # --> prints nothing

` `中命令的输出是:

copyFromLocal: Cannot create file/user/file5._COPYING_. Name node is in safe mode.

存储输出有什么问题吗?

1 个答案:

答案 0 :(得分:1)

Perl中的反引号仅捕获标准输出。如果hadoop正在将消息发送到标准错误,则反引号将不会捕获它。有几种方法,请参阅How can I capture STDERR from an external command?的perlfaq答案。最简单的方法是使用2>&1将标准错误文件描述符重定向到标准输出文件描述符:

$error1 = `hadoop fs -copyFromLocal $src_dir $tgt_dir 2>&1`;

Capture::Tiny之类的模块也非常好。