2012-06-24 3 views
0

나는 direcory의 크기를 얻기 위해 perl 스크립트를 통해 유닉스 명령을 실행하고 있습니다.perl 스크립트에서 유닉스 명령의 실행 값을 얻으십시오.

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

어떻게 필자의 펄 스크립트로 결과를 얻을 수 있습니까? 내가

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

을 사용하고 그러나 크기 = 0을주고있다

;

+0

-1 [Perl FAQ] (http://faq.perl.org) : [시스템()으로 명령 출력을 얻을 수없는 이유는 무엇입니까?] (http : // learn.perl.org/faq/perlfaq8.html#Why-cant-I-get-the-output-of-a-command-with-system-) – daxim

답변

1

system 호출은 출력이 아닌 호출의 상태를 반환합니다.

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

공백이있는 경로에 대해 실패합니다. "'; rm -rf /'"로 명명 된 경로의 경우 특히 실패합니다. – ikegami

1

그것은 성공 명령 상태를 반환 것 : 같은 역 따옴표 (또는 qx 연산자)를 사용합니다. 대신

는 수행

$size = `du -sh $path` 

(역 인용 부호 구분 명령)

+0

왜 백틱을 탈출하나요? – TLP

+1

공백이있는 경로에 대해 실패합니다. "'; rm -rf /'"로 명명 된 경로의 경우 특히 실패합니다. 순수 펄 솔루션에 대해서는 – ikegami

2

펄 구문 한 배쉬 매우 유사하다. 명령을 역 인용하면 출력이 변수에 저장됩니다. 명령이 여러 줄에 출력이있는 경우

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. – TLP

1

출력을 파일 핸들로 리디렉션하고 출력을 얻는 데 사용할 수 있습니다.

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