2012-06-24 86 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>) { 
... 
}