2012-06-24 91 views
0

我正在通过perl脚本执行unix命令来获取direcory的大小。获取在perl脚本中执行unix命令的值

$path = "/dir1/di2/"; 
system("du -sh $path"); 

我怎样才能得到结果回我的Perl脚本。

我使用

$size = system("du -sh $path"); 
print $size 

但它给大小= 0;

+0

-1这是一个[Perl常见问题](http://faq.perl.org):[为什么我不能使用system()获取命令的输出?](http:// learn.perl.org/faq/perlfaq8.html#Why-cant-I-get-the-output-of-a-command-with-system-) – daxim

回答

1

a system调用返回调用的状态,而不是输出。使用反引号(或qx运算符):

$size = qx(du -sh $path); 
+1

带空格的路径失败。对于名为“'; rm -rf /'”的路径来说尤其不好。 – ikegami

1

它返回命令状态,即成功。

相反,这样做:

$size = `du -sh $path` 

(反引号界定命令)

+0

为什么要逃避反引号? – TLP

+1

有空格的路径失败。对于名为“'; rm -rf /'”的路径来说尤其不好。 – ikegami

2

Perl的语法非常相似,猛砸之一。反引导您的命令,它的输出将存储在变量中。

my $variable = `command`; 
    print $variable; 

如果您的命令对多行输出,可以将其分配给一个阵列,例如:

my @files = `ls -l` 
    chomp @files; 

然后,每次输出线将存储在所述阵列的不同元件。

如何做反引用可能会有所不同,具体取决于您的键盘布局。在美国布局上,它是波浪号(〜)的同一个关键。

4

您也可以使用perl(例如, as shown here。类似于

use File::Find;   
find(sub { $size += -s if -f $_ }, $path); 
+2

+1纯perl解决方案。 – TLP

1

或者您可以将输出重定向到文件句柄并使用它获取输出。

open (FD,"du -hs \"$path\" |"); 
while (<FD>) { 
... 
}