ubuntu perl无法获得shell输出?

时间:2016-04-26 07:18:20

标签: perl shell

我在perl脚本中运行命令,如下所示:

#!/usr/bin/env perl
`tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`;

我得到了/tmp/js.tgz,但我无法得到详细的输出?

2 个答案:

答案 0 :(得分:3)

Backticks(``) or qx运行命令并返回STDOUT。因此,您只需要一个变量来捕获STDOUTSTDERR未受影响。

#!/usr/bin/env perl
my $stdout = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`;

print "$stdout";

您可以使用system。它会运行一个命令并返回其退出状态(STDOUT并且STDERR不受影响)。

my $exit_status = system('tar zvcf /tmp/js.tgz -C /home/cuidehe/js .');
print "Exit Status: $exit_status\n";

答案 1 :(得分:3)

您需要在Perl中为命令输出指定目标:

my $output = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`;
print $output;

所有输出线最终都是$ output。 命名变量$ STDOUT并不好,因为它是Perl中的保留关键字。

该命令可能会产生多行输出。使用open可能会更好:

open my $fh,'-|','tar zvcf /tmp/js.tgz -C /home/cuidehe/js .'
    or die 'Error launching tar';
while (<$fh>) {
    chomp; # Remove the trailing \n from the input line
    print "Got line: $_\n"; # Do whatever you want here.
}
close $fh;

您也可以使用

捕获STDERR
open my $fh,'-|','tar zvcf /tmp/js.tgz -C /home/cuidehe/js . 2>&1'
    or die 'Error launching tar';

这会将任何错误重定向到STDERR,并且您将(文件和错误)同时发送到同一$fh

IPC::Open3可以捕获(STDOUT和STDERR)到不同的文件句柄。

更新(感谢@ Dummy00001):

my @output = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`;

将tar输出的每一行作为一个数组项返回。